2011-08-02 53 views
0

不在我有這樣一個模型如下:DefaultModelBinder行爲時財產的請求

public class TestViewModel 
{ 
    string UpdateProperty { get; set; } 
    string IgnoreProperty { get; set; } 
    ComplexType ComplexProperty { get; set; } 
} 

其中

public class ComplexType 
{ 
    long? Code { get; set; } 
    string Name { get; set; } 
} 

我的控制器動作:

public Edit(int id, FormColleciton formCollection) 
{ 
    var model = service.GetModel(id); 
    TryUpdateModel(model); 

    //... 
} 

當調用編輯動作我具有僅包含UpdateProperty的鍵/值的formCollection參數。

調用TryUpdateModel UpdateProperty設置正確後,IgnoreProperty保持未被觸摸,但ComplexProperty設置爲null,即使它以前有一個值。

Try TryUpdateModel()只修改作爲請求一部分的屬性嗎?如果不是這種情況,最好的解決方法是什麼,這樣ComplexProperty只有在包含在請求中時才被修改?


有人指出出來後由達林說上面的測試用例中並沒有表現出哪裏這個問題真的發生時我添加了一個場景中的問題:

public class TestViewModel 
{ 
    public List<SubModel> List { get; set; } 
} 

public class SubModel 
{ 
    public ComplexType ComplexTypeOne { get; set; } 
    public string StringOne { get; set; } 
} 

public class ComplexType 
{ 
    public long? Code { get; set; } 
    public string Name { get; set; } 
} 

控制器動作:

public ActionResult Index() 
{ 
    var model = new TestViewModel 
        { 
         List = new List<SubModel> { 
          new SubModel{ 
           ComplexTypeOne = new ComplexType{Code = 1, Name = "5"}, 
           StringOne = "String One" 
          } 
         } 
        }; 

    if (TryUpdateModel(model)) { } 

    return View(model); 
} 

發送此請求:

/Home/Index?List[0].StringOne=test 

更新SubModel.StringOne屬性,但將ComplexTypeOne設置爲null,即使它未包含在請求中。

這是預期的行爲(因爲這不會發生,除非使用複雜類型的枚舉)?如何最好地解決這個問題?

回答

1

您的測試用例一定有問題,因爲我無法複製它。下面是我的嘗試:

模型(請注意,我用的公共屬性):

public class TestViewModel 
{ 
    public string UpdateProperty { get; set; } 
    public string IgnoreProperty { get; set; } 
    public ComplexType ComplexProperty { get; set; } 
} 

public class ComplexType 
{ 
    public long? Code { get; set; } 
    public string Name { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new TestViewModel 
     { 
      IgnoreProperty = "to be ignored", 
      UpdateProperty = "to be updated", 
      ComplexProperty = new ComplexType 
      { 
       Code = 1, 
       Name = "5" 
      } 
     }; 

     if (TryUpdateModel(model)) 
     { 

     } 
     return View(); 
    } 
} 

現在,我發送以下請求:/home/index?UpdateProperty=abc和條件只有UpdateProperty內用查詢字符串中的新值修改。所有其他屬性,包括複雜屬性,都保持不變。

另請注意,FormCollection操作參數無用。

+0

將查看此 - 我可能錯過簡化後在這裏發佈問題的問題。 (我離開FormCollection參數來查看來自請求的值)感謝您確認默認的模型聯編程序應該保持該值不變。 – TonE

+0

已修改我的帖子以包含發生問題的示例。 – TonE

+0

已發佈一個新的問題與工作示例在這裏:http://stackoverflow.com/q/6957264/95423 – TonE