问题描述
我在View中有两个DropDownList。当我尝试传递这些参数时,控制器中的方法被调用,但参数等于null。
当我在浏览器(F12网络)中签入时,我会观察参数-已发送参数,但方法中的参数仍然为空
P.S。 我尝试更改List或Location和JobTitle或CommonEntity上的参数类型,但不起作用
控制器:
public class HelloController: Controller
{
[HttpGet]
public IActionResult Index()
{
var locations = new List<Location>()
{
new Location()
{
Id = 0,Title = "Russia"
},new Location()
{
Id = 1,Title = "Canada"
}
};
ViewBag.Location = locations;
var jobs = new List<JobTitle>()
{
new JobsTitle()
{
Id = 0,Title = "Manager"
},new JobsTitle()
{
Id = 1,Title = "Programmer"
}
};
ViewBag.JobTitle = new SelectList(jobs,"Title","Title");
return View();
}
[HttpPost]
public string Find(string answer1,string answer2)
{
return "Fine";
}
查看:
@using Stargate.Core.Models.CoreEntities
@model CommonEntity
@using (Html.BeginForm())
{
@Html.DropDownListFor(m => m.Location.Title,new SelectList(ViewBag.Location,"Title"))
@Html.DropDownListFor(m => m.JobTitle.Title,new SelectList(ViewBag.JobTitle,"Title"))
<button type="submit">Find</button>
}
型号:
public class CommonEntity
{
public Location Location { get; set; }
public JobTitle JobTitle { get; set; }
}
public class JobTitle
{
public long Id { get; set; }
public string Title { get; set; }
}
public class Location
{
public long Id { get; set; }
public string Title { get; set; }
}
解决方法
您做错了事,
- 您应该更正cshtml,以便在提交表单时将其定位到“查找操作”,
@using (Html.BeginForm("Find","Hello"))
- 在“查找操作”中,您应该提供DefaultModelBinder可解析的输入args,因为您没有ViewModel来拦截响应,因此建议您接收FormCollection,并可以从以下位置访问值:在那里。
[HttpPost]
public string Find(FormCollection form)
{
return "Fine";
}
,
尝试如下更新参数。有关更多详细信息,请参阅Model Binding in ASP.NET Core。
[HttpPost]
public string Find(Location Location,JobTitle JobTitle)
{
return "Fine";
}
或者您可以尝试使用CommonEntity
的参数,如下所示。
[HttpPost]
public string Find(CommonEntity commonEntity)
{
var locationTitle = commonEntity.Location.Title;
var jobTitle = commonEntity.JobTitle.Title;
return "Fine";
}
,
由于您接受的参数名称为answer1
,answer2
,因此您在视图中应该有一个匹配的名称,以便可以成功绑定。
您可以按以下方式修改前端代码(DropDownListFor
至DropDownList
):
@model CommonEntity
@using (Html.BeginForm("Find","Hello"))
{
@Html.DropDownList("answer1",new SelectList(ViewBag.Location,"Title","Title"))
@Html.DropDownList("answer2",new SelectList(ViewBag.JobTitle,"Title"))
<button type="submit">Find</button>
}
您的控制器:
public class HelloController : Controller
{
[HttpGet]
public IActionResult Index()
{
var locations = new List<Location>()
{
new Location()
{
Id = 0,Title = "Russia"
},new Location()
{
Id = 1,Title = "Canada"
}
};
ViewBag.Location = locations;
var jobs = new List<JobTitle>()
{
new JobTitle()
{
Id = 0,Title = "Manager"
},new JobTitle()
{
Id = 1,Title = "Programmer"
}
};
ViewBag.JobTitle = jobs;
return View();
}
[HttpPost]
public string Find(string answer1,string answer2)
{
return "Fine";
}
}
班级:
public class CommonEntity
{
public Location Location { get; set; }
public JobTitle JobTitle { get; set; }
}
public class JobTitle
{
public long Id { get; set; }
public string Title { get; set; }
}
public class Location
{
public long Id { get; set; }
public string Title { get; set; }
}