2011-01-13 24 views
15

Bên trong hành động điều khiển của tôi Tôi có đoạn mã sau:Cách thêm lỗi xác thực trong bộ sưu tập xác thực 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:

Đây là mã cập nhật của tôi:

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

The Model loo ks như sau:

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; 
     } 
    } 
} 

Và đây là hành động điều khiển của tôi:

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

    return View(); 
} 

Không có gì xảy ra! Tôi hoàn toàn bị mất trên cái này!

UPDATE 3:

bây giờ tôi đang sử dụng đoạn mã sau nhưng vẫn xác nhận là không bắn:

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

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

CẬP NHẬT 4:

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

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

Và Controller trông giống như sau :

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

CẬP NHẬT 5: Xác nhận không bắn:

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

Trả lời

6

Bạn có thể sử dụng một mô hình điểm:

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

và sau đó:

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:

Sau khi hàng trăm bình luận về câu trả lời của tôi, tôi cảm thấy trong sự cần thiết để cung cấp một ví dụ làm việc đầy đủ:

Như bắt đầu thông thường với một mô hình xem :

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"); 
     } 
    } 
} 

Sau đó, bộ điều khiển:

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"); 
    } 
} 

và cuối cùng là xem:

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

Thật không may, có một giá trị khi người dùng chọn tùy chọn "Vui lòng chọn". – johndoe

+1

@johndoe, không nên có. Nếu bạn sử dụng phương thức trợ giúp sau: '<% = Html.DropDownListFor (x => x.Id, Model.Items," - vui lòng chọn - ")%>' để tạo danh sách thả xuống của bạn, sẽ không có giá trị nào được gửi và xác thực sẽ tự động hoạt động. Ngoài ra nó có ý nghĩa hơn để gửi chuỗi rỗng khi người dùng đã không chọn bất cứ điều gì thay vì một số giá trị giả. –

+0

Tôi cũng nên thêm rằng trang không được gửi (không có nút gửi) nhưng một hành động được gọi thông qua một liên kết và đó là lý do tại sao việc xác thực không được kích hoạt! – johndoe

53

Sử dụng ModelState.AddModelError()

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

và đầu ra để quan điểm như thế này:

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

+1 cho câu trả lời trực tiếp & ngắn "Sử dụng' ModelState.AddModelError() '". –

+0

Tôi lấy chìa khóa từ đâu? Tôi ahve như sau: ' @ Html.EditorFor (model => model.ClientID, mới {htmlAttributes = new {@class =" form-control "}}) @ Html.ValidationMessageFor (model => model.ClientID, "", mới {@class = "text-danger"}) 'điều gì sẽ là chìa khóa? – Zapnologica

+0

Nếu bạn biết thuộc tính nào bạn đang làm việc với bạn có thể dựa vào DataAnnotations hoặc thử thêm lỗi cho "ClientID" – hunter

0

Về cập nhật của bạn # 3, tôi nghi ngờ Thats vì bạn đang thực sự gán giá trị, chỉ là một chuỗi rỗng của nó (Bắt buộc là kiểm tra cho null).

Bạn muốn làm có điều này:

[Required(AllowEmptyStrings = false)] 

Tốt nhất mặc dù sẽ được thực hiện xác nhận tùy chỉnh (bạn có thể sẽ muốn xác minh các khóa có trong danh sách, vv)

Chỉnh sửa: sửa lỗi chính tả trong mã - quên đóng ")"

Các vấn đề liên quan