2011-01-13 6 views
15

Внутри действия моего контроллера У меня есть следующий код:Как добавить ошибки проверки в коллекцию проверки asp.net mvc?

public ActionResult GridAction(string id) 
{ 
    if (String.IsNullOrEmpty(id)) 
    { 
     // add errors to the errors collection and then return the view saying that you cannot select the dropdownlist value with the "Please Select" option 
    } 

    return View(); 
} 

UPDATE:

if (String.IsNullOrEmpty(id)) 
{ 
    // add error 
    ModelState.AddModelError("GridActionDropDownList", "Please select an option"); 
    return RedirectToAction("Orders"); 
} 

UPDATE 2:

Вот мой обновленный код:

@Html.DropDownListFor(x => x.SelectedGridAction, Model.GridActions,"Please Select") 
@Html.ValidationMessageFor(x => x.SelectedGridAction) 

Модель loo кс, как следующее:

public class MyInvoicesViewModel 
{ 

    private List<SelectListItem> _gridActions; 

    public int CurrentGridAction { get; set; } 

    [Required(ErrorMessage = "Please select an option")] 
    public string SelectedGridAction { get; set; } 

    public List<SelectListItem> GridActions 
    { 
     get 
     { 
      _gridActions = new List<SelectListItem>(); 
      _gridActions.Add(new SelectListItem() { Text = "Export to Excel", Value = "1" }); 

      return _gridActions; 
     } 
    } 
} 

А вот мой контроллер действия:

public ActionResult GridAction(string id) 
{ 
    if (String.IsNullOrEmpty(id)) 
    { 
     // add error 
     ModelState.AddModelError("SelectedGridAction", "Please select an option"); 
     return RedirectToAction("Orders"); 
    } 

    return View(); 
} 

Ничего не происходит! Я полностью потерял это!

UPDATE 3:

Я сейчас, используя следующий код, но до сих пор проверка не стрельбы:

public ActionResult GridAction(string id) 
{ 
    var myViewModel= new MyViewModel(); 
    myViewModel.SelectedGridAction = id; // id is passed as null   

    if (!ModelState.IsValid) 
    { 
     return View("Orders"); 
    } 

UPDATE 4:

$("#linkGridAction").click(function() { 
    alert('link grid action clicked'); 

    $.get('GridAction/', { SelectedGridAction: $("#SelectedGridAction").val() }, function (result) { 
     alert('success'); 
    }); 
}); 

и контроллер выглядит следующим образом :

// OrderViewModel has a property called SelectedGridAction. 
public ActionResult GridAction(OrderViewModel orderViewModel) 
{ 
    return View(); 
} 

UPDATE 5: Проверка не стрельбы:

public ActionResult GridAction(OrderViewModel orderViewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View("Orders", orderViewModel); 
    } 
    return View(); 
} 

ответ

6

Вы можете использовать представление модели:

public class MyViewModel 
{ 
    [Required] 
    public string Id { get; set; } 
} 

а затем:

public ActionResult GridAction(MyViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // the model is valid, the user has selected an id => use it 
     return RedirectToAction("Success"); 
    } 
    return View(); 
} 

UPDATE:

После сотни комментариев на мой ответ, я чувствую в необходимости обеспечить полный рабочий пример:

Как обычно начать с модели представления :

public class MyViewModel 
{ 
    [Required] 
    public string SelectedItemId { get; set; } 

    public IEnumerable<SelectListItem> Items 
    { 
     get 
     { 
      // Dummy data 
      return new SelectList(Enumerable.Range(1, 10) 
       .Select(i => new SelectListItem 
       { 
        Value = i.ToString(), 
        Text = "item " + i 
       }), 
      "Value", "Text"); 
     } 
    } 
} 

Затем контроллер:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // The user didn't select any value => redisplay the form 
      return View(model); 
     } 
     // TODO: do something with model.SelectedItemId 
     return RedirectToAction("Success"); 
    } 
} 

и, наконец, вид:

<% using (Html.BeginForm()) { %> 
    <%= Html.DropDownListFor(
     x => x.SelectedItemId, 
     Model.Items, 
     "-- Select Item --" 
    ) %> 
    <%= Html.ValidationMessageFor(x => x.SelectedItemId) %> 
    <input type="submit" value="OK" /> 
<% } %> 
+0

К сожалению, существует значение, когда пользователь выбирает параметр «Пожалуйста, выберите». – johndoe

+1

@johndoe, не должно быть. Если вы используете следующий вспомогательный метод: '<% = Html.DropDownListFor (x => x.Id, Model.Items," - выберите - ")%>', чтобы сгенерировать выпадающее меню, никакое значение не будет отправлено и проверено будет автоматически работать. Также имеет смысл отправлять пустую строку, когда пользователь ничего не выбрал, а не какое-то фиктивное значение. –

+0

Я также должен добавить, что страница не отправляется (кнопка отправки), но действие вызывается по ссылке, и поэтому валидация не увольняется! – johndoe

53

Использование ModelState.AddModelError()

ModelState.AddModelError("MyDropDownListKey", "Please Select"); 

и выход к виду, как это:

<%= Html.ValidationMessage("MyDropDownListKey") %> 
+4

+1 для прямого и короткого ответа «Используйте« ModelState.AddModelError() '». –

+0

Где я могу получить ключ? Я бы сказал следующее: ' @ Html.EditorFor (model => model.ClientID, new {htmlAttributes = new {@class =" form-control "}}) @ Html.ValidationMessageFor (model => model.ClientID, "", new {@class = "text-danger"}) 'какой бы ключ? – Zapnologica

+0

Если вы знаете, какое свойство, с которым вы работаете, можете полагаться на DataAnnotations или попробуйте добавить ошибку для «ClientID» – hunter

0

Что касается вашего обновления # 3, я подозреваю, то потому что вы на самом деле присвоения значения, его просто пустая строка (обязательно является проверка на нуль).

Вы хотите есть это:

[Required(AllowEmptyStrings = false)] 

Лучше хотя бы выполнить пользовательскую проверку (вы, вероятно, хотите, чтобы проверить ключ находится в списке, и т.д.)

Edit: фиксированная опечатка в коде - забыли закрытие »)«

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