使用POST将ViewModel发送回控制器

时间:2013-11-02 03:40:37

标签: c# asp.net-mvc asp.net-mvc-4 post model-binding

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

2 个答案:

答案 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");
}