假设我有一个页面(View)需要某个ViewModel:
@model IEnumerable<MyProject.ViewModels.MyViewModel>
在这个页面中,我有一个通过另一个ViewModel发布数据的表单(让我们称之为PostModel):
@using (Html.BeginForm("Order", "Order", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Give your order info</h4>
<hr />
@Html.ValidationSummary()
<div class="form-group">
<label for="Order.Name" class="col-md-2 control-label">Name:</label>
<div class="col-md-10">
@Html.TextBox("Order.Name", null, new { @class = "form-control" })
@Html.ValidationMessage("Order.Name")
</div>
</div>
...
}
这是在控制器上使用Order
HttpPost
操作方法处理的,该方法接受我的PostModel类型的参数。
我可以用上面的样式显示验证消息。我的问题是,如何(如果可能的话)我可以为PostModel强制输入这个类型?类似的东西:
@Html.TextBox<MyPostModel>(t => t.Order.Name, ...)
@Html.ValidationMessageFor<MyPostModel>(t => t.Order.Name)
这是否可行,而无需更改页面的ViewModel?
答案 0 :(得分:3)
您可以简单地为该表单使用不同的局部视图,在该局部视图中,您可以将其指定为您想要的任何类型,在本例中,正如我在您的代码示例中所见,Order
假设您有一个名为Order
的模型,其定义如下
public class Order
{
public string Name { get; set; }
}
以及名为_MyPostPartialView.cshtml
的部分视图及其定义
@model Order
@using (Html.BeginForm("Order", "Order", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Give your order info</h4>
<hr />
@Html.ValidationSummary()
<div class="form-group">
@Html.Label(m => m.Name, "Name:")
<div class="col-md-10">
@Html.TextBox(m => m.Name, null, new { @class = "form-control" })
@Html.ValidationMessage(m => m.Name)
</div>
</div>
...
}
你完成了!
答案 1 :(得分:0)
尝试在视图中导入javascript
jquery.validate.min.js
jquery.validate.unobtrusive.min.js
在表单视图中
@Html.LabelFor(model => model.ClientDocument[0].Number)
@Html.TextBoxFor(model => model.ClientDocument[0].Number, new { @class = "form-control" })
在您的控制器中
[HttpPost]
public ActionResult Create(YourViewModel model){
if (ModelState.IsValid)//to complete validate server side
}
在ViewModel中*尝试使用DataAnnotation
[Display(Name = "Name of Field")]
[Required(ErrorMessage="your message error")]
public string Name { get; set; }
public DocumentViewModel[] ClientDocument { get; set; }
答案 2 :(得分:0)
简单的答案是不要使用不同的视图模型进行GET和POST。没有理由。您应该通过用于GET请求的视图模型呈现您发布的任何内容。如果由于某种原因发布了最初不在用于GET请求的视图模型上的内容,那么坦率地说,停止它。