请考虑以下代码段。 GuestResponse
只是一个具有某些属性作为数据模型的类。
当访问者调用localhost\home\RsvpForm
时,控制器返回View而不传递数据,以便访问者获得一个空白的HTML表单。
在部分填充表单后(仅用于模拟案例IsValid=false
),访问者将表单提交回服务器。服务器检查数据的有效性,在这种情况下,它是无效的,因此服务器返回View()
。
我不明白为什么return View();
而不是return View(gr);
仍保留以前的填充数据?当我们在调用return View();
时未传递模型数据时,视图如何获取以前填充的数据?
public class HomeController : Controller
{
[HttpGet]
public ViewResult RsvpForm()
{
return View();
}
[HttpPost]
public ViewResult RsvpForm(GuestResponse gr)
{
if (ModelState.IsValid)
{
return View("ThankYou", gr);
}
else
{
return View();// rather than return View(gr);
}
}
}
@model PartyInvites.Models.GuestResponse
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<body>
@using (Html.BeginForm())
{
@Html.ValidationSummary()
Your name: @Html.TextBoxFor(x => x.Name)
... other controls go here ...
<input type="submit" value="Submit RSVP" />
}
</body>
</html>
答案 0 :(得分:2)
您可以在不再传递模型的情况下查看以前的数据,因为ModelState
属性会记住这些值并再次绑定到视图。 ModelState
的类型为ModelStateDictionary,如果您要清除那些您必须从控制器中调用ModelState.Clear()
的内容。
更新:有关ModelState本身的详细信息,请检查anwser是否已询问问题here
答案 1 :(得分:1)
视图仅绑定到模型,以便在返回View时传递该模型中的数据,并将发布该类型的模型。
例如:
@model GuestResponse
然后:
@Html.TextBoxFor(x=>x.SomeProperty)
在这种情况下,它是mvc自己的bhaviour,虽然你在没有传递模型对象的情况下执行return View()
,但View会使用Model进行渲染,但是它会考虑使用{{1}的模型实例}属性,并将使用空值呈现控件。
表达式并不关心您的模型是否为null,因为它通过查看已定义的强类型类的已定义属性来确定如何呈现文本框。
我们正在使用我们正在使用的HTML帮助程序将模型实例传递给将用于数据绑定的视图。
我们在控制器操作方法中没有传递任何内容。因此,它与Model强类型,并且没有数据可以绑定到它,因此它将使用空值呈现控件。
在验证案例中,在asp.net中,mvc验证在客户端完成,默认情况下包含 jquery-unobtrusive-validate.js ,用于处理客户端验证,因此操作永远不会被命中直到所有表单都有效,如果您删除 jquery-unobtrusive.js 和 jquery-unobtrusive-validate.js ,那么如果Model是,则会看到View填充为空无效。
答案 2 :(得分:0)
除了接受的答案解释的内容之外,View.Model
始终会覆盖View.ModelState
,因此调用View(<model>)
只是无用的事情。
[HttpPost]
public ViewResult RsvpForm(GuestResponse gr)
{
if (ModelState.IsValid)
{
return View("ThankYou", gr);
}
else
{
return View(gr);// or return View(GR); where GR is another object of GuestResponse
}
}