Inside my controller's action I have the following code:
在我的控制器的动作中,我有以下代码:
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:
更新2:
Here is my updated code:
这是我更新的代码:
@Html.DropDownListFor(x => x.SelectedGridAction, Model.GridActions,"Please Select")
@Html.ValidationMessageFor(x => x.SelectedGridAction)
The Model looks like the following:
该模型如下所示:
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;
}
}
}
And here is my controller action:
这是我的控制器动作:
public ActionResult GridAction(string id)
{
if (String.IsNullOrEmpty(id))
{
// add error
ModelState.AddModelError("SelectedGridAction", "Please select an option");
return RedirectToAction("Orders");
}
return View();
}
Nothing happens! I am totally lost on this one!
什么都没发生!我完全迷失在这一个!
UPDATE 3:
更新3:
I am now using the following code but still the validation is not firing:
我现在使用以下代码但仍未验证验证:
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:
更新4:
$("#linkGridAction").click(function () {
alert('link grid action clicked');
$.get('GridAction/', { SelectedGridAction: $("#SelectedGridAction").val() }, function (result) {
alert('success');
});
});
And the Controller looks like the following:
控制器如下所示:
// OrderViewModel has a property called SelectedGridAction.
public ActionResult GridAction(OrderViewModel orderViewModel)
{
return View();
}
UPDATE 5: Validation is not firing:
更新5:验证未触发:
public ActionResult GridAction(OrderViewModel orderViewModel)
{
if (!ModelState.IsValid)
{
return View("Orders", orderViewModel);
}
return View();
}
3 个解决方案
#1
6
You could use a view model:
您可以使用视图模型:
public class MyViewModel
{
[Required]
public string Id { get; set; }
}
and then:
接着:
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:
更新:
After the hundreds of comments on my answer I feel in the necessity to provide a full working example:
在对我的回答发表数百条评论之后,我觉得有必要提供一个完整的工作示例:
As usual start with a view model:
像往常一样从视图模型开始:
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");
}
}
}
Then a controller:
然后一个控制器:
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");
}
}
and finally the view:
最后是观点:
<% using (Html.BeginForm()) { %>
<%= Html.DropDownListFor(
x => x.SelectedItemId,
Model.Items,
"-- Select Item --"
) %>
<%= Html.ValidationMessageFor(x => x.SelectedItemId) %>
<input type="submit" value="OK" />
<% } %>
#2
53
Use ModelState.AddModelError()
使用ModelState.AddModelError()
ModelState.AddModelError("MyDropDownListKey", "Please Select");
and output to the view like this:
并像这样输出到视图:
<%= Html.ValidationMessage("MyDropDownListKey") %>
#3
0
Regarding your update #3, I suspect thats because you are actually assigning the value, its just an empty string (Required is checking for null).
关于你的更新#3,我怀疑那是因为你实际上是在分配值,它只是一个空字符串(Required是检查null)。
You want to do have this:
你想要这样做:
[Required(AllowEmptyStrings = false)]
Your best bet though would be to perform custom validation (you will likely want to verify the key is in the list, etc)
您最好的选择是执行自定义验证(您可能希望验证密钥是否在列表中,等等)
Edit: fixed typo in the code - forgot closing ")"
编辑:在代码中修复拼写错误 - 忘记关闭“)”
#1
6
You could use a view model:
您可以使用视图模型:
public class MyViewModel
{
[Required]
public string Id { get; set; }
}
and then:
接着:
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:
更新:
After the hundreds of comments on my answer I feel in the necessity to provide a full working example:
在对我的回答发表数百条评论之后,我觉得有必要提供一个完整的工作示例:
As usual start with a view model:
像往常一样从视图模型开始:
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");
}
}
}
Then a controller:
然后一个控制器:
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");
}
}
and finally the view:
最后是观点:
<% using (Html.BeginForm()) { %>
<%= Html.DropDownListFor(
x => x.SelectedItemId,
Model.Items,
"-- Select Item --"
) %>
<%= Html.ValidationMessageFor(x => x.SelectedItemId) %>
<input type="submit" value="OK" />
<% } %>
#2
53
Use ModelState.AddModelError()
使用ModelState.AddModelError()
ModelState.AddModelError("MyDropDownListKey", "Please Select");
and output to the view like this:
并像这样输出到视图:
<%= Html.ValidationMessage("MyDropDownListKey") %>
#3
0
Regarding your update #3, I suspect thats because you are actually assigning the value, its just an empty string (Required is checking for null).
关于你的更新#3,我怀疑那是因为你实际上是在分配值,它只是一个空字符串(Required是检查null)。
You want to do have this:
你想要这样做:
[Required(AllowEmptyStrings = false)]
Your best bet though would be to perform custom validation (you will likely want to verify the key is in the list, etc)
您最好的选择是执行自定义验证(您可能希望验证密钥是否在列表中,等等)
Edit: fixed typo in the code - forgot closing ")"
编辑:在代码中修复拼写错误 - 忘记关闭“)”