3

对于 MVC4,通过 将ViewModel用于填充视图的对象发送回控制器的最佳实践方法是POST什么?

4

2 回答 2

5

假设您想要一个带有此视图模型的登录表单:

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填充了帖子值的实例。

于 2013-11-02T12:06:40.547 回答
-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");
}
于 2013-11-02T04:57:51.853 回答