2015-12-31 2 views
1

У меня есть модель домена заказа на ремонт. Вот только три из его свойств:Как правильно форматировать значение readtly @TextBoxFor Value в качестве валюты?

[DataType(DataType.Currency)] 
    [DisplayFormat(DataFormatString = "{0:C}", ApplyFormatInEditMode = true)] 
    [DisplayName("Labor Total")] 
    [ScaffoldColumn(true)] 
    [ReadOnly(true)] 
    public virtual decimal LaborTotal => Labor.Sum(p => p.LineTotal); 

    [DataType(DataType.Currency)] 
    [DisplayFormat(DataFormatString = "{0:C}", ApplyFormatInEditMode = true)] 
    [DisplayName("Parts Total")] 
    [ScaffoldColumn(true)] 
    [ReadOnly(true)] 
    public virtual decimal PartsTotal => RepairOrderParts.Sum(p => p.LineTotal); 

    [DataType(DataType.Currency)] 
    [DisplayFormat(DataFormatString = "{0:C}", ApplyFormatInEditMode = true)] 
    [DisplayName("Order Total")] 
    [ScaffoldColumn(true)] 
    [ReadOnly(true)] 
    public virtual decimal OrderTotal => LaborTotal + PartsTotal; 

После того как я Scaffolded контроллера и просмотров я модифицировал Edit.cshtml так Это будет включать в себя три моих валютных свойств, например:

<div class="form-group"> 
     @Html.LabelFor(model => model.LaborTotal, htmlAttributes: new {@class = "control-label col-md-2"}) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(model => model.LaborTotal, new {@class = "form-control", @readonly = "readonly", Value = string.Format("{0:C}", Model.LaborTotal) }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.PartsTotal, htmlAttributes: new {@class = "control-label col-md-2"}) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(model => model.PartsTotal, new {@class = "form-control", @readonly = "readonly", Value = string.Format("{0:C}", Model.PartsTotal) }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.OrderTotal, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(model => model.OrderTotal, new { @class = "form-control", @readonly = "readonly", Value = string.Format("{0:C}", Model.OrderTotal) }) 
     </div> 
    </div> 

Если я удалить Value = string.Format… часть линии. Все значки отображаются отлично, и я могу внести изменения и сохранить запись. С оставшимся Value = string.Format… мои значения отформатированы правильно, но я не могу сохранить никаких изменений. Он жалуется, что все три строки не являются числовыми (никаких значков запятой или доллара). Я вынул строку Validate, но это не помогло, и не переключилось на @EditorFor.

Спасибо заранее,

Edit:

Рабочая, но не отформатирована для валюты:

<div class="form-group"> 
     <label class="control-label col-md-2" for="LaborTotal">Labor Total</label> 
     <div class="col-md-10"> 
      <input class="form-control" data-val="true" data-val-number="The field Labor Total must be a number." data-val-required="The Labor Total field is required." id="LaborTotal" name="LaborTotal" readonly="readonly" type="text" value="75.00" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <label class="control-label col-md-2" for="PartsTotal">Parts Total</label> 
     <div class="col-md-10"> 
      <input class="form-control" data-val="true" data-val-number="The field Parts Total must be a number." data-val-required="The Parts Total field is required." id="PartsTotal" name="PartsTotal" readonly="readonly" type="text" value="0" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <label class="control-label col-md-2" for="OrderTotal">Order Total</label> 
     <div class="col-md-10"> 
      <input class="form-control" data-val="true" data-val-number="The field Order Total must be a number." data-val-required="The Order Total field is required." id="OrderTotal" name="OrderTotal" readonly="readonly" type="text" value="75.00" /> 
     </div> 
    </div> 

С попытке форматирования для валюты:

<div class="form-group"> 
     <label class="control-label col-md-2" for="LaborTotal">Labor Total</label> 
     <div class="col-md-10"> 
      <input Value="$75.00" class="form-control" data-val="true" data-val-number="The field Labor Total must be a number." data-val-required="The Labor Total field is required." id="LaborTotal" name="LaborTotal" readonly="readonly" type="text" value="75.00" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <label class="control-label col-md-2" for="PartsTotal">Parts Total</label> 
     <div class="col-md-10"> 
      <input Value="$0.00" class="form-control" data-val="true" data-val-number="The field Parts Total must be a number." data-val-required="The Parts Total field is required." id="PartsTotal" name="PartsTotal" readonly="readonly" type="text" value="0" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <label class="control-label col-md-2" for="OrderTotal">Order Total</label> 
     <div class="col-md-10"> 
      <input Value="$75.00" class="form-control" data-val="true" data-val-number="The field Order Total must be a number." data-val-required="The Order Total field is required." id="OrderTotal" name="OrderTotal" readonly="readonly" type="text" value="75.00" /> 
     </div> 
    </div> 
+0

Вы можете поделиться предоставленным html. т. е. html, который вы получили от этой бритвы – lazy

+0

Это достаточно, @lazy? Меня обвиняют в том, что я слишком много задаю вопросы. – Randy

+0

Спасибо за публикацию HTML. Похоже, что если мы используем редактор For, он должен установить html-ввод как десятичный, а затем использовать формат даты, который будет корректно отформатировать значение. Кроме того, для форматирования вы можете использовать CSS, как указано в этом примере stackoverflow - http://stackoverflow.com/questions/5080451/how-should-i-use-editorfor-in-mvc-for-a-currency-money-type – lazy

ответ

1

Когда ты сделайте Value = string.Format("{0:C}", Model.LaborTotal) в htmlAttributes, razor выполнит код C# и вернет значение, "$86.34", (Предполагая, что значение вашего LaborTotal - 86.34345M), которое является строкой. Таким образом, разметка генерируется ваш взгляд будет

<input value="$86.34" id="LaborTotal" name="LaborTotal" readonly="readonly" type="text"> 

Некоторые другие HTML свойства опущены

Итак, когда вы отправить его обратно, строка может не присвоен десятичного собственности. Вы можете удалить символ валюты из поля ввода и отобразить его на ярлыке.

<label>$</label> 
@Html.TextBoxFor(model => model.LaborTotal, 
     new {@class = "form-control", @readonly = "readonly", 
     Value = string.Format("{0:0.00}", Model.LaborTotal)}) 

Если вы все еще хотите точки сеть, чтобы дать вам символ валюты вместо жесткого кодирования, вы можете создать новую модель представления и имеете строковую версию вашей десятичной собственности и использовать его, а когда он отправил обратно, вы можете преобразовать его в десятичный, используя одну из перегрузок метода Parse.

Кроме того, похоже, что вы используете это поле только для целей показа (пользователь не редактирует это значение. В этом случае я бы предложил прочитать существующий объект и обновить только поле, которое вы хотите обновить (в этом случае, вы не хотите обновлять LaborTotal).

Чтобы сделать это, и, чтобы избежать overposting, лучшим решением является создание модель представления для зрения

public class LabelTotalSummaryVm 
{ 
    public int Id {set;get;} 
    public decimal LaborTotal {set;get;}  
    public string SomeEditableProperty { set;get;} 
} 

И в вашем GET действия

public ActionResult View(int id) 
{ 
    var vm = new LabelTotalSummaryVm { Id=id }; 
    var e = yourDbContext.RepairOrders.FirstOrDefault(s=>s==Id); 
    if(e!=null) 
    { 
    vm.LaborTotal =e.LaborTotal ; 
    vm.SomeEditableProperty =e.SomeEditableProperty ; 
    } 
    return View(vm); 
} 

А на ваш взгляд,

@model LabelTotalSummaryVm 
@using(Html.BeginForm()) 
{ 
    @Html.TextBoxFor(s=>s.SomeEditableProperty); 
    <label>$ @Model.LaborTotal</label> 
    @Html.HiddenFor(s=>s.Id) 
    <input type="submit" /> 
} 

И в вашем посте вы укажете только недвижимость, которую хотите обновить

[HttpPost] 
public ActionResult View(LabelTotalSummaryVm model) 
{ 
     var e = yourDbContext.RepairOrders.FirstOrDefault(s=>s==Id); 
     if(e!=null) 
     {  
     vm.SomeEditableProperty =model.SomeEditableProperty ; 
     yourDbContext.Entry(e).State=EntityState.Modified; 
     yourDbContext.SaveChanges(); 
     return RedirectToAction("SomeSuccess"); 
     } 
     return View(vm); 
}