2013-02-26 71 views
12

如果我有了一个模型的视图,可以说汽车另一种模式..发布到在ASP.NET MVC形式

@model Project.Car 

这个观点我想创建一个将数据发送到表单中一种新的模式

@using (Html.BeginForm("Add", "Controller")) 
    { 
     @Html.Hidden("ID", "1") 
     @Html.Hidden("UserID", "44") 
     @Html.TextArea("Description") 
    } 

我发现,如果我的动作与定义我的ViewModel它不工作(模型总是空):

[HttpPost] 
    public PartialViewResult Add(ViewModels.NewModel model) 

但是,如果我使用的FormCollection它的工作原理:

[HttpPost] 
    public PartialViewResult Add(FormCollection formCollection) 

这里是视图模型:

public class NewModel 
{ 
    public int ID { get; set; } 
    public int UserID { get; set; } 
    public string Description { get; set; } 
} 

我的问题是,我可以从我的表单POST数据为newModel?它所处的视图与Project.Car绑定是正确的。它是页面上的一个小表单,需要发布与Project.Car无关的一组不同的数据。

+0

你可以发布ViewModel吗? – brenton 2013-02-26 16:22:57

+0

当然,只是添加它。 – Alex 2013-02-26 16:25:50

+0

但是您正在发布Project.Car。你不是吗? – idipous 2013-02-26 16:26:30

回答

6

您的模型名称与动作之间存在差异。在示例中,您显示的模型名为Add,而在您的操作中,您使用的是ViewModels.NewModel。更糟糕的是,您的视图被强制键入名为Car的模型。凌乱这一切。

public class CarViewModel 
{ 
    public int ID { get; set; } 
    public int UserID { get; set; } 
    public string Description { get; set; } 
} 

,然后控制器:

所以通过定义一个正确的视图模型开始

public class CarsController: Controller 
{ 
    public ActionResult Add() 
    { 
     var model = new CarViewModel 
     { 
      // don't ask me, those are the values you hardcoded in your view 
      ID = 1, 
      UserID = 44, 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public PartialViewResult Add(CarViewModel model) 
    { 
     ... 
    } 
} 

和相应的强类型以您的视图模型:

@model CarViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(x => x.ID) 
    @Html.HiddenFor(x => x.UserID) 
    @Html.TextAreaFor(x => x.Description) 
    <button type="submit">Add</button> 
} 
+0

我很抱歉,我在快速处理某个功能时发布了这个功能,并且必须更改操作和控制器的名称以便进行示例。我纠正了这个问题。 – Alex 2013-02-26 17:33:55

1

您的视图设置为使用Project.Car类型的模型,但是你的动作方法需要一个型号为ViewModels.NewModel,,而且你的模型类发布是Add

更改他们都匹配(假设Add是正确的):

查看:

@model Add 

控制器:

[HttpPost] 
public PartialViewResult Add(Add model) 
4
My question is can I post data to NewModel from my form? 

简短的回答是肯定的,你可以发布形式到与应用程序中任何模型相关的任何控制器上的任何控制器操作。

例如,对于您的形式张贴到NewModel控制器上的“Add”行动:

@using (Html.BeginForm("Add", "NewModel")) 
    { 
     @Html.Hidden("ID", "1") 
     @Html.Hidden("UserID", "44") 
     @Html.TextArea("Description") 
    } 

由于您的看法是强类型的,以你的Car模型,你可以改变这一点,发送一个ViewModel你的观点,其类型模型的更新相匹配(如Darin demonstrated),或者你需要在你的控制器从Car后数据映射到NewModel

CarControllerAdd动作(POST):

[HttpPost] 
public PartialViewResult Add(Car model) 
{ 
    //now map attribute values from the Car model onto 
    //corresponding attributes of an instance of NewModel 
    NewModel new = new NewModel(); 
    new.ID = model.ID; 
    new.UserID = model.UserID; 
    new.Desc = model.Description; 
    //etc... 

    //update your model/db 
    _db.Add(new); 

    //Redirect however you wish... 
} 

此外,检查出AutoMapper,对象对对象的映射器,它能够自动的ViewModels映射到模型,反之亦然。

-3

您也可以为此创建自定义模型活页夹。

2

是的,您可以强制将视图键入一个模型并将其发布到另一个模型。

在这样做,你有两个选择:

  1. 手动为每个输入字段提供正确的名称,以便默认粘合剂会理解并创建模型(example)。

    虽然这可行,但这也意味着您必须密切关注拼写错误,并且如果拼错了属性名称,则不会收到任何编译时错误。

  2. 在绑定到新模型类型的视图中手动创建HTML助手。它会为你正确生成HTML。

    为了构建帮助器,您需要一个包装器对象,它将以IViewDataContainer接口的形式公开您的模型实例。你可以在任何地方定义的包装,包括模型本身:

    var ModelToPost = new YourApp.Models.NewModel() { ID = 1, UserID = 43, Description = "" } 
    
    var hlp = new HtmlHelper<YourApp.Models.NewModel> 
         (this.ViewContext, 
          new YourApp.Models.NewModel.WrapperForHtmlHelper(ModelToPost) 
         ); 
    

    然后你使用助手像往常一样:

    public class NewModel 
    { 
        public int ID { get; set; } 
        public int UserID { get; set; } 
        public string Description { get; set; } 
    
        public class WrapperForHtmlHelper : System.Web.Mvc.IViewDataContainer 
        { 
        public System.Web.Mvc.ViewDataDictionary ViewData { get; set; } 
    
        public WrapperForHtmlHelper(NewModel value) 
        { 
         this.ViewData = new System.Web.Mvc.ViewDataDictionary<NewModel>(value); 
        } 
        } 
    } 
    
    在你创建一个绑定到NewModel实例的助手从视图

    然后:

    @hlp.HiddenFor(m => m.ID) 
    @hlp.HiddenFor(m => m.UserID) 
    @hlp.TextAreaFor(m => m.Description) 
    

    然后你的PartialViewResult Add(ViewModels.NewModel model)会正确接收数据。