在PRO ASP.NET MVC書:如何避免將域邏輯放入控制器?
這當然是可能把域 邏輯到控制器,即使 你不應該,只是因爲它似乎在某個瞬間高壓權宜之計 。
只是一個人爲的例子,如果應用程序不允許否定順序,將數量更改爲1的位置?如果我們按照該域的邏輯不應放置在控制器的原則,這肯定是不建議使用:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult PlaceOrder(Order order)
{
if (ModelState.IsValid)
{
order.Submit();
return View("Thanks", order);
}
else
{
if (order.Quantity <= 0)
{
ModelState.Remove("Quantity");
order.Quantity = 1;
}
return View(order);
}
}
所以下面的代碼是指符合MVC原則正確的代碼,即它遵循的分離擔心,如果它是域邏輯,你不應該在控制器中看到它的代碼。所以,這就是我試圖把域邏輯型號:
public class Order : IDataErrorInfo
{
public int OrderId { set; get; }
public int ProductId { set; get; }
public int Quantity { set; get; }
public string Error { get { return null; } }
public string this[string propName]
{
get
{
if (propName == "Quantity" && Quantity <= 0)
{
Quantity = 1;
return "0 or negative quantity not allowed, changed it to 1";
}
else
return null;
}
}
}
控制器(SAN的域邏輯):
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult PlaceOrder(Order order)
{
if (ModelState.IsValid)
{
order.Submit();
return View("Thanks", order);
}
else
{
// Response.Write(order.Quantity.ToString()); // this was changed in Model
return View(order); // but the View didn't reflect that fact
}
}
與方法唯一的問題,模型(訂單)不能影響ModelState,並且程序總是顯示用戶最後輸入的內容。
什麼是最好的方法,所以我仍然可以避免將域邏輯放置在控制器中,View仍然能夠反映Model屬性的值?
具體的例子,除了模型是否與ModelState同步?理想情況下(因爲MVC的原則是令人鼓舞的)ModelState的更新不應該在Controller上完成 – Hao 2010-09-30 07:40:07