2009-09-11 43 views
0

我想在對象B中嵌入對象A的實例。我已經有一個動作和一個編輯視圖呈現對象B的窗體。我使它成爲一個強類型部分查看接受B.asp.net MVC:嵌入對象編輯

我現在正在處理創建操作,所以我做b = new B(); b.A =新的A();

現在我要呈現B的表單,然後調用A的部分視圖,並將其傳遞給b.A.

但是我得到的是一個FormCollection,或者我的新的A對象的B字段設置爲null。 在第一種情況下一切正常,但如果表單未能成功,我該怎麼辦?我是否需要使用錯誤的數據手動創建對象,並使用無效的ModelState再次傳遞它們? 有沒有可能的第二種選擇?

或者我只是需要避免有嵌套視圖?作爲一種選擇,我認爲創建一個特殊的模型對象只是爲了處理包含A和B的所有值的表單,然後當這個表單驗證時我會手動填充A和B對象並保存它們。這是唯一的解決方案嗎?

回答

1

你應該可以像你所描述的那樣使用A和B.

假設我們有以下幾點:

public class B { 
    public A A {get; set;} 
    public string X {get; set;} 
    public int Y {get;set;} 
} 

public class A { 
    public string Z {get; set;} 
} 

//then in your controller: 

public ActionResult Edit() { 
    return View ( 
     new B { 
      A = new A { Z = "AyyZee" } , 
      X = "BeeEcks", 
      Y = 7 
     }); 
} 

所以你的模型是B.

的實例

你的觀點,你的嵌套的局部視圖應該產生HTML是這樣的:

<input type="text" name="A.Z" value="AyyZee" /> 
<input type="text" name="X" value="BeeEcks" /> 
<input type="text" name="Y" value="7" /> 

現在默認的模型聯編程序應該能夠把它掛起來:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit (B input) { 
    // apply changes 
    //the binder should have populated input.A 
} 

請注意,這隻適用於A和B都具有默認構造函數且相對簡單的類。如果你有更復雜的東西,你可以使用自己的粘結劑:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit ([ModelBinder(typeof(BBinder))] B input) { 
    //... 
} 

public class BBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     return 
      new B { 
       A = new A { Z = Request["A.Z"] } , 
       X = Request["X"], 
       Y = int.Parse(Request["Y"]) 
      }; 
    } 
} 
+0

我無法得到這個工作。也許我只是在某個地方犯了一個簡單的錯誤。星期一再試一次,也許我會有一個更新的觀點:D非常感謝您的建議。 – Palantir 2009-09-11 15:03:51

+1

這裏有更多關於粘合劑的細節:http://weblogs.asp.net/scottgu/archive/2008/10/16/asp-net-mvc-beta-released.aspx – Keith 2009-09-11 15:16:45

1

創建包含A和B自己的自定義模型,然後創建從模型 視圖時您提交表格,您將只是能夠更新您的自定義模型並更新/添加您的個人模型。

public class CustomViewModel 
{ 
    public ModelA myAModel {get;set;} 
    public ModelB mybModel {get;set;} 
} 

該模型將創建一個包含A和B,將使你再 您發佈的FormCollection可以被用來爲每個蹦牀網上單人模式和更新設定值/然後創建一個單獨形式的視圖。

0

我與此代碼的問題是由兩件事情引起的,無論是在模型類:

  1. 的字段必須是性能,而不是正常的領域
  2. 構造缺少將初始化內部對象

因此,從溶液中的類以上應該是:

public class B { 
    public A a {get; set;} 
    public string x {get; set;} 
    public int y {get;set;} 
    public B() { 
    a = new A(); 
    } 
} 

public class A {  
    public string z {get; set;} 
    public A() {} 
}