2012-12-10 4 views
0

Я использую asp.net Razor с C#. Я пытаюсь проверить, что введенное значение является валютой, но я не могу сделать это правильно.AddModelError не передается обратно контроллеру (обновлено)

Это в моем PaymentModel:

[Required] 
    [DataType(DataType.Currency)] 
    [DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)] 
    [Display(Name = "Payment Amount:")] 
    public decimal Amount { get; set; } 

Это мое мнение Предоплата:

@model SuburbanCustPortal.Models.PaymentModel.PrePayment 

@{ 
    ViewBag.Title = "Make a payment!"; 
} 

<script> 
$(function(){ 
    $("#AccountId").change(function(){ 
    var val=$(this).val(); 
    $("#currentBalance").load("@Url.Action("GetMyValue","Payment")", { custid : val }); 
    document.forms[0].Amount.focus(); 
    }); 
}); 
</script> 

<h2>Make a Payment</h2> 

    @using (Html.BeginForm("SendPayment", "Payment", FormMethod.Post)) 
    { 
    @Html.ValidationSummary(true, "Please correct the errors and try again.") 
    <div> 
     <fieldset> 
     <legend>Please enter the amount of the payment below:</legend> 

     <div class="editor-label"> 
      Please select an account. 
     </div> 

     @Html.DropDownListFor(x => x.AccountId, (IEnumerable<SelectListItem>)ViewBag.Accounts) 

     <div class="editor-label"> 
      @Html.LabelFor(m => m.AccountBalance) 
     </div> 
     <div class="editor-field"> 
      <label class="sizedCustomerDataLeftLabel" id="currentBalance">@Html.DisplayFor(model => model.AccountBalance)&nbsp;</label> 
     </div>  

     <div class="editor-label"> 
      @Html.LabelFor(m => m.Amount) 
     </div> 
     <div class="editor-field focus"> 
      @Html.TextBoxFor(m => m.Amount, new { @class = "makePaymentText" }) 
      @Html.ValidationMessageFor(m => m.Amount) 
     </div> 

     <p> 
      <input id="btn" class="makePaymentInput" type="submit" value="Pay Now" onclick="DisableSubmitButton()"/> 
     </p> 
     </fieldset> 
    </div> 
    } 

This is my Prepayment ActionResult: 

    [Authorize] 
    public ActionResult PrePayment(PaymentModel.PrePayment model) 
    { 
     var list = new List<SelectListItem>(); 
     var custs = _client.RequestCustomersForAccount(User.Identity.Name); 
     foreach (var customerData in custs) 
     { 
     var acctno = customerData.Branch + customerData.AccountNumber; 
     var acctnoname = string.Format(" {0} - {1} ", acctno, customerData.Name); 
     // msg += string.Format("*** {0} - {1} ***{2}", customerData.AccountId, acctnoname, Environment.NewLine); 
     list.Add(new SelectListItem() { Text = acctnoname, Value = customerData.AccountId }); 
     } 

     if (custs.Length > 0) 
     { 
     model.AccountBalance = String.Format("{0:C}", Decimal.Parse(custs[0].TotalBalance)); 
     } 

     ViewBag.Accounts = list; 
     return View(model); 
    } 

Пост зрения вызывает SendPayment, и это был мой чек в начале представления:

if (model.Amount == 0) 
    {  
     ModelState.AddModelError("Amount", "Invalid amount."); 
     return RedirectToAction("PrePayment", model); 
    } 

Возможно, я не могу получить PrePayment, чтобы вернуть свою ошибку, которую я отправил из AddModelEr ROR. Я изменил его:

if (model.Amount == 0) 
    {  
     ModelState.AddModelError("Amount", "Invalid amount."); 
     return View("PrePayment", model); 
    } 

Но он никогда не называет контроллер и ошибки отсеивать, так как он не имеет данные, которые он ожидает.

У кого-нибудь есть идеи, как я перенаправляю обратно к вызывающему виду с ошибками?

==== ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ ====

Вот моя ПРЕДОПЛАТА Вид:

[Authorize] 
public ActionResult PrePayment(PaymentModel.PrePayment model) 
{ 
    var list = new List<SelectListItem>(); 
    var custs = _client.RequestCustomersForAccount(User.Identity.Name); 
    foreach (var customerData in custs) 
    { 
     var acctno = customerData.Branch + customerData.AccountNumber; 
     var acctnoname = string.Format(" {0} - {1} ", acctno, customerData.Name); 
     // msg += string.Format("*** {0} - {1} ***{2}", customerData.AccountId, acctnoname, Environment.NewLine); 
     list.Add(new SelectListItem() { Text = acctnoname, Value = customerData.AccountId }); 
    } 

    if (custs.Length > 0) 
    { 
     var amt =String.Format("{0:C}", Decimal.Parse(custs[0].TotalBalance)); 
     model.AccountBalance = amt; 
     decimal namt; 
     if (decimal.TryParse(amt.Replace(",",string.Empty).Replace("$", string.Empty), out namt)) 
     { 
     model.Amount = namt; 
     } 
    } 
    ViewBag.Accounts = list; 
    return View(model); 
} 
+0

Это из-за перенаправления. – SLaks

+0

какие ошибки вы получаете? –

+0

Я попробовал View, и он никогда не вызывал контроллер. Как мне заставить его вызвать контроллер и передать эрос? – ErocM

ответ

2

Необходимо решить несколько вопросов.

1. return View("PrePayment", model); 
This will not call the controller, as the function name suggests, it only passing your object to the specified "View"(.cshtml file) 

2.  return RedirectToAction("PrePayment", model); 
You will not persist modelstate data, because you are doing a redirect. 

Предлагаемый рабочий процесс, который решит вашу проблему. По крайней мере, он решил мой.

1. Get the form to post to "PrePayment" instead of SendPayment and you will create a new method with the following signature and have all you validation logic in the method 
[Authorize] 
[HttpPost] 
public ActionResult PrePayment(PaymentModel.PrePayment model) 

2. If everything goes well then redirect to the success/send payment page depending on your requirement 

3. If somehow you need to pass model object onto the next action. Use TempData like following. This will temporarily persist the data till the next action. Then it get disposed: 
TempData["payment"]=model; 
+0

Это замечательно ... объяснение того, что я делаю неправильно, и отличный пример того, как его исправить! Спасибо за помощь!!! – ErocM

0

Может быть, вы должны добавить аннотацию данных в вашу собственность и использовать ModelState.IsValid свойства для проверки это

[Required] 
[DataType(DataType.Currency)] 
[DisplayFormat(DataFormatString = "{0:F2}", ApplyFormatInEditMode = true)] 
[Display(Name = "Payment Amount:")] 
[Range(0.01, Double.MaxValue)] 
public decimal Amount { get; set; } 

В вашем методе POST, проверьте, передается ли проверка, если не отправить тыс e вернитесь к виду.

[HttpPost] 
public ActionResult SendPayment(PrePayment model) 
{ 
    if(ModelState.IsValid) 
    { 
    //do the fun stuff 
    } 
    return View(model); 
} 
+0

Если я только что вернул представление, он пытается отправить его обратно в PrePayment, где он сейчас. Но, тем не менее, я отправил модель, когда попытался вызвать представление. Я изменил свой код выше, чтобы показать это. – ErocM

+0

Спасибо за обновление, но отображающее сообщение, такое как «Поле платежа: должно быть от 0,01 до 9000000». Кажется вроде неряшливым для меня. Кроме того, сообщение отображается, как только начинается форма. – ErocM

+0

Вы можете настроить сообщение об ошибке в аннотации данных. Вы проверяете свою страницу при загрузке? – Shyju

Смежные вопросы