2010-03-30 32 views
0

所以我正在研究編寫一些自定義MVC擴展,我試圖解決的第一個問題是FormattedTextBox處理諸如貨幣,日期和時間等事情。我有完美的渲染,格式化,強大的類型和一切都是黃金。但是,我現在遇到的問題是在頁面發回數據時清理格式化的東西。使用自定義MVC擴展來修改發佈數據?

以貨幣格式爲例。我們用這些例子來說明美元。當一個對象具有一個十進制屬性時,該值將爲79.95。您編輯的看法是這樣的:

<%= Html.FormattedTextBox(model => Model.Person.HourlyWage, "{0:C}") %> 

這是一切都很好的GET請求,但在POST,該值將是$79.95,當你分配到小數其中,變得不快樂很快並在那裏推出0

所以我的問題是,如何在MVC框架去之前讓代碼在某處工作,並開始將它推回到我的ViewModel中?我寧願這樣做服務器端比客戶端。

謝謝!

回答

1

一種解決方案是編寫一個custom model binder,它將能夠將綁定$79.95轉換爲模型中的十進制字段。另一個解決方案是在客戶端進行。在jQuery form.submit處理程序中,您可以修改要發佈的輸入字段的值。

+0

這樣做,然後我的控制器需要知道我的視圖的「控制」裏面的實現,對吧?我不喜歡那個...... – Jaxidian 2010-03-30 21:48:47

+0

不是你的控制器,你的模型活頁夾,這是他們的目的。但如果你不喜歡它,你仍然有JavaScript解決方案。 – 2010-03-30 22:01:10

+0

僅僅因爲它是第一個發佈就標記爲兩者之間的答案。兩者都給出了相同的解決方案 - 希望我可以以某種方式分配信用,因爲Branislav發佈了一個代碼示例。 – Jaxidian 2010-03-31 17:02:57

1

您可以使用custom Model Binders將發佈的數據推送到對象中。

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(
    [ModelBinder(typeof(YourModelBinderAttribute))]YourClass obj) 
{ 
    // your code here 

    return View(); 
} 

public class MessageModelBinderAttribute : IModelBinder 
{ 
    #region IModelBinder Members 

    public object BindModel(
     ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
    { 
     YourClass obj = new YourClass(); 

     ValueProviderResult result; 
     if (bindingContext.ValueProvider.TryGetValue(
      "YourPostedInputName", out result)) 
     { 
      obj.Price = result.AttemptedValue; 
     } 

     return message; 
    } 

    #endregion 
} 
+0

這樣做,然後我的控制器需要知道我的視圖的「控制」內部的實現,對吧?我不喜歡那個... – Jaxidian 2010-03-30 21:48:00

+0

你的控制器不會知道,你的模型活頁夾將會是。但仍然比在控制器的操作中使用參數要好。 – 2010-03-31 07:04:33

相關問題