我目前有一个带有提交和取消按钮的表单。根据某些逻辑,每次页面加载时,我都希望相同的取消按钮重定向到应用程序中的其他不同页面。这是我在aspx视图中的代码,它根据我的属性
更改了location.href <% if (Model.MyProperty.Equals("something"))
{ %>
<input class="btnCancel" type="button" value="" onclick="location.href='<%: Url.Action("MyAction","MyController", new {Area="MyArea"},null)%>'" />
<% } %>
<% else if (Model.MyProperty.Equals("somethingelse"))
{ %>
<input class="btnCancel" type="button" value="" onclick="location.href='<%: Url.Action("MyOtherAction","MyOtherController", new {Area="SomeOtherArea"},null)%>'" />
<% } %>
这是正确而优雅的方式吗?如果有办法,我宁愿减少多个IF-ELSE条件。
感谢您的时间。
答案 0 :(得分:5)
我总是处理多个重定向选项的方法是在控制器操作中设置href值。
View是通用的,但控制器操作特定于渲染页面的上下文。因此,在您的模型中,创建一个名为CancelUrl的属性。现在,在控制器操作中,将其设置为您希望它转到的链接。
model.CancelUrl = Url.Action("action", "controller");
这样,你在视图中所要做的就是说
<a href="@Model.CancelUrl">Text</a>
答案 1 :(得分:1)
您可以创建一个取消方法,该方法将您的属性作为参数并在控制器中适当地重定向。无论如何,这个逻辑可能不应该在你的视图中,因为视图应该几乎有0个逻辑
答案 2 :(得分:0)
我会在视图模型中使用将用于决定取消操作的属性(如您所有),以及任何其他必需属性。
例如:
public class IndexModel
{
//any other properties you need to define here
public string MyProperty { get; set; }
}
然后你的观点看起来类似于:
@model IndexModel
@using (Html.BeginForm())
{
//other information you may want to submit would go here and in the model.
@Html.HiddenFor(m => m.MyProperty)
<button type="submit" name="submit" value="submit">submit</button>
<button type="submit" name="cancel" value="cancel">cancel</button>
}
最后,您的帖子操作应该决定应该返回的下一个操作:
[HttpPost]
public ActionResult Index(IndexModel model)
{
if (!string.IsNullOrEmpty(Request["submit"]))
{
if (ModelState.IsValid)
{
//any processing of the model here
return RedirectToAction("TheNextAction");
}
return View();
}
if (model.MyProperty.Equals("something"))
{
return RedirectToAction("MyAction", "MyController", new { area = "MyArea" });
}
else //assumes the only other option is "somethingelse"
{
return RedirectToAction("MyOtherAction", "MyOtherController", new { area = "SomeOtherArea" });
}
}