2013-02-26 57 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)會正確接收數據。