对于MVC4,通过ViewModel
发送用于将视图填充回控制器的POST
的最佳做法是什么?
答案 0 :(得分:3)
假设您需要具有此视图模型的登录表单:
public class LoginModel
{
[Required]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
public bool RememberMe { get; set; }
}
在视图中使用此视图模型很简单,只需向视图发送LoginModel
的新实例:
public ActionResult Login()
{
var model = new LoginModel();
return View(model);
}
现在我们可以创建Login.cshtml
视图:
@model App.Models.LoginModel
@using (Html.BeginForm())
{
@Html.LabelFor(model => model.UserName)
@Html.TextBoxFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
@Html.LabelFor(model => model.Password)
@Html.PasswordFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
@Html.CheckboxFor(model => model.RememberMe)
@Html.LabelFor(model => model.RememberMe)
<input type="submit" value="Login" />
}
现在我们必须在控制器中创建一个处理此表单的帖子的操作。我们可以这样做:
[HttpPost]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
// Authenticate the user with information in LoginModel.
}
// Something went wrong, redisplay view with the model.
return View(model);
}
HttpPost
属性将确保只能通过发布请求来访问控制器操作。
MVC将使用它的魔法并将视图中的所有属性绑定回填充了帖子中值的LoginModel
实例。
答案 1 :(得分:1)
一种方法是让Post controller
接受ViewModel
作为参数,然后将其属性映射到您的域模型。
public class Model
{
public DateTime Birthday {get;set;}
}
public class ViewModel
{
public string Month {get;set;}
public string Day {get;set;}
public string Year {get;set;}
}
<强>控制器强>
[HttpPost]
public ActionResult Create(ViewModel viewModel)
{
string birthday = viewModel.Month + "/" + viewModel.day + "/" + viewModel.year;
Model model = new Model { Birthday = Convert.ToDateTime(birthday) } ;
// save
return RedirectToAction("Index");
}