C# 为什么空模型返回到post方法?
好的,已经发布了一个类似的问题,但是我没有看到适用于这个场景的答案,或者更可能的是,我完全理解答案 基本上我有一个get ViewResult和Post ActionResult,get返回正确的模型,但是当提交时,模型返回的所有属性都是null? 如果用户在其他方法中使用了类似的代码,并且可以正常工作,那么有人能看到这个问题吗? 仍在学习,因此请解释任何答案,谢谢C# 为什么空模型返回到post方法?,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,好的,已经发布了一个类似的问题,但是我没有看到适用于这个场景的答案,或者更可能的是,我完全理解答案 基本上我有一个get ViewResult和Post ActionResult,get返回正确的模型,但是当提交时,模型返回的所有属性都是null? 如果用户在其他方法中使用了类似的代码,并且可以正常工作,那么有人能看到这个问题吗? 仍在学习,因此请解释任何答案,谢谢 [HttpGet] public ViewResult DeleteUser(string userna
[HttpGet]
public ViewResult DeleteUser(string username)
{
IQueryRunner<User> getUser = new NhQueryRunner<User>();
User user = getUser.GetQueryResult(new GetNamedEntity<User>(username));
ViewUserModel model = Mapper.Map<User, ViewUserModel>(user);
return View("DeleteUser", model);
}
[HttpPost]
public ActionResult DeleteUser(ViewUserModel model)
{
}
[HttpGet]
public ViewResult DeleteUser(字符串用户名)
{
IQueryRunner getUser=新的NhQueryRunner();
User User=getUser.GetQueryResult(新的GetNamedEntity(用户名));
ViewUserModel=Mapper.Map(用户);
返回视图(“删除用户”,模型);
}
[HttpPost]
公共操作结果删除用户(ViewUserModel模型)
{
}
看法
@使用(Html.BeginForm(“DeleteUser”、“Company”、FormMethod.Post))
{
是否确实要删除用户名-@Html.DisplayFor(m=>m.Name)
}
您得到的是一个空模型,因为表单中的模型属性没有输入
控件。即使是DisplayFor
也不会在POST
中返回值。我建议这样做:
@Html.HiddenFor(m => m.Property1)
@Html.HiddenFor(m => m.Property2)
@Html.HiddenFor(m => m.Property3)
...
其中,
Property{n}
是模型上的属性。您得到的是一个空模型,因为表单中没有模型上属性的输入
控件。即使是DisplayFor
也不会在POST
中返回值。我建议这样做:
@Html.HiddenFor(m => m.Property1)
@Html.HiddenFor(m => m.Property2)
@Html.HiddenFor(m => m.Property3)
...
其中
属性{n}
是模型上的属性。表单从其输入提交值。您没有名称等于模型属性名称的输入,因此提交的表单数据不包含这些值。其他(查询字符串、路由数据等)也没有对应于模型属性的值。因此,模型绑定器无法绑定值,并且您的模型的所有属性都等于null
(它们是引用类型属性)
您可以按照@Michael的建议使用@Html.HiddenFor(m=>m.Name)`在表单中生成隐藏输入:
<input id="Name" type="hidden" value="username_value" name="Name">
现在,如果您检查
Request.Form
values集合,它将包含带有键Name
和username\u值的条目FormValueProvider
提供对模型绑定器的此集合的访问。将成功绑定名为的属性。表单从其输入提交值。您没有名称等于模型属性名称的输入,因此提交的表单数据不包含这些值。其他(查询字符串、路由数据等)也没有对应于模型属性的值。因此,模型绑定器无法绑定值,并且您的模型的所有属性都等于null
(它们是引用类型属性)
您可以按照@Michael的建议使用@Html.HiddenFor(m=>m.Name)`在表单中生成隐藏输入:
<input id="Name" type="hidden" value="username_value" name="Name">
现在,如果您检查Request.Form
values集合,它将包含带有键Name
和username\u值的条目FormValueProvider
提供对模型绑定器的此集合的访问。将成功绑定名为名称为的属性。您的表单部分中需要有表单输入元素,以便浏览器可以发回服务器。更新代码并添加以下属性
@using (Html.BeginForm("DeleteUser", "Company", FormMethod.Post))
{
<fieldset>
Are you sure you want to delete Username - @Html.DisplayFor(m => m.Name)
@Html.HiddenFor(x=>x.Name)
<input type="submit" value="Remove User"/>
</fieldset>
}
@使用(Html.BeginForm(“DeleteUser”、“Company”、FormMethod.Post))
{
是否确实要删除用户名-@Html.DisplayFor(m=>m.Name)
@Html.HiddenFor(x=>x.Name)
}
您的表单部分需要有一个表单输入元素,以便浏览器可以发回服务器。更新代码并添加以下属性
@using (Html.BeginForm("DeleteUser", "Company", FormMethod.Post))
{
<fieldset>
Are you sure you want to delete Username - @Html.DisplayFor(m => m.Name)
@Html.HiddenFor(x=>x.Name)
<input type="submit" value="Remove User"/>
</fieldset>
}
@使用(Html.BeginForm(“DeleteUser”、“Company”、FormMethod.Post))
{
是否确实要删除用户名-@Html.DisplayFor(m=>m.Name)
@Html.HiddenFor(x=>x.Name)
}
这看起来像是name
而不是username
@YairNevet谢谢,在编写答案时只查看了Get方法参数,现在更新了如何检查请求。表单值集合?我想我也保留了原始的输入标记行?@mkell它在控制器操作中可用。您不需要手动验证它-我只是指出,若值将通过表单提交,那个么它应该出现在该集合中。Binder将自动查找该值@SergeyBerezovskiy,我很清楚,我在视图中将我的值列为@Html.HiddenFor(m=>m.FirstName)等。。添加您在上面编写的代码输入行?…我做错了什么,因为我仍然得到相同的错误?这似乎是name
而不是username
@YairNevet谢谢,在编写答案时只查看了Get方法参数,现在更新了如何检查请求。表单值集合?我想我也保留了原始的输入标记行?@mkell它在控制器操作中可用。您不需要手动验证它-我只是指出,若值将通过表单提交,那个么它应该出现在该集合中。Binder将自动查找该值@SergeyBerezovskiy,我很清楚,我在视图中将我的值列为@Html.HiddenFor(m=>m.FirstName)等。。加上你上面写的代码输入行?…我做错了什么,因为我仍然得到了同样的错误?谢谢Michael,我确信这是解决方案,但是我在到达post方法之前遇到了一个错误,“Value不能为null。Parameter name:key”(模型中没有列出“key”),我需要做更多的挖掘,但我原以为程序会在提交后立即到达post方法的断点?。。。。。干杯汉克·迈克尔,我相信这是解决办法,不过我之前犯了一个错误