问题描述
|
嗨,我是MVC Razor的新手
我试图做一个带有3 Button插入,删除和更新的页面。
我的观点看起来像
<div>
@using (Html.BeginForm())
{
<input type=\"button\" class=\"button1\" value=\"Insert\" />
<input type=\"button\" class=\"button1\" value=\"Delete\" />
<input type=\"button\" class=\"button1\" value=\"Update\" />
}
</div>
我的控制器就像
public ActionResult Index()
{
return View();
}
我将如何在控制器中获取这些按钮的事件,以便能够编写每个按钮的逻辑。请帮助我获取编码或任何合适的链接,这将有助于解决此问题。
谢谢
圣
解决方法
[编辑]
在其他答案的评论中重申我的观点:当您将LOGIC绑定到C#中的按钮的值时,您会将C#代码绑定到该语言。
想象一下,您将英文版的“保存”按钮设置为:
<input type=\"submit\" value=\"Insert\" name=\'button\' />
在代码中,您将使用以下值进行切换:
public ActionResult Index(string button)
{
switch (button)
{
case \"Insert\": ...
case \"Update\": ...
case \"Delete\": ...
}
return View();
}
现在-用另一种语言查看该表格时-您认为会发生什么?!?!
这是威尔士html输出:
<input type=\"submit\" value=\"Mewnosod\" name=\'button\' />
和德国人:
<input type=\"submit\" value=\"Einfügen\" name=\'button\' />
那将如何运作?!
全球化不是一个单独的问题!
如果使用以下方法,您的操作将如下所示:
public ActionResult Index(string button)
{
switch (button)
{
case \"Insert\": ...
case \"Update\": ...
case \"Delete\": ...
case \"Einfügen\": ...
case \"Mewnosod\": ....
.... a load of other languages for each action type -
}
return View();
}
请...认真...
[/编辑]
这是我的MVC操作选择器代码:Asp.Net Mvc操作选择器
本质上,您需要一个动作选择器类:
/// <summary>
/// AcceptParameterAttribute to enable submit buttons to execute specific action methods.
/// </summary>
public class AcceptParameterAttribute : ActionMethodSelectorAttribute
{
/// <summary>
/// Gets or sets the value to use in submit button to identify which method to select. This must be unique in each controller.
/// </summary>
public string Action { get; set; }
/// <summary>
/// Determines whether the action method selection is valid for the specified controller context.
/// </summary>
/// <param name=\"controllerContext\">The controller context.</param>
/// <param name=\"methodInfo\">Information about the action method.</param>
/// <returns>true if the action method selection is valid for the specified controller context; otherwise,false.</returns>
public override bool IsValidForRequest(ControllerContext controllerContext,MethodInfo methodInfo)
{
if (controllerContext == null)
{
throw new ArgumentNullException(\"controllerContext\");
}
var req = controllerContext.RequestContext.HttpContext.Request;
return req.Form.AllKeys.Contains(this.Action);
}
}
可以修改按钮名称。
然后,您可以使用以下命令装饰动作:
[AcceptParameter(Action = \"Edit\")]
public ActionResult Person_Edit(PersonViewModel model){
...
}
切换动作很脏-这是一种更清洁的方法。我想也自然得多。
, 给按钮起一个名字:
<div>
@using (Html.BeginForm())
{
<input type=\"button\" name=\"button\" class=\"button1\" value=\"Insert\" />
<input type=\"button\" name=\"button\" class=\"button1\" value=\"Delete\" />
<input type=\"button\" name=\"button\" class=\"button1\" value=\"Update\" />
}
</div>
并在您的操作中使用它:
public ActionResult Index(string button)
{
switch (button)
{
case \"Insert\": ...
case \"Update\": ...
case \"Delete\": ...
}
return View();
}
话虽如此,我不会使用这种方法。我会即时将表单动作修改为不同的控制器动作(使用Url.Action
),从而将该代码与使用jQuery的单击处理程序挂钩。
, 如果您像我一样使用本地化,这是改进的AcceptParameterAttribute
public class AcceptParameterAttribute : ActionMethodSelectorAttribute
{
public string Name { get; set; }
public Type ResourceType { set; get; }
public string Value { get; set; }
public override bool IsValidForRequest(ControllerContext controllerContext,MethodInfo methodInfo)
{
HttpRequestBase request = controllerContext.RequestContext.HttpContext.Request;
if (ResourceType != null)
{
ResourceManager resourceManager = new ResourceManager(ResourceType);
return request.Form[Name] == resourceManager.GetString(Value);
}
return request.Form[Name] == Value;
}
}
用法类似于DisplayAttribute
[AcceptParameter(ResourceType = typeof(Resources),Name = \"submit\",Value = \"Search\")]
和按钮
<input type=\"button\" name=\"submit\" value=\"@Resources.Search\" />
, 我建议您阅读一些有关MVC3的简单教程-这将使您有机会了解MVC框架的基本原理。您可以从这里开始。
现在您的问题是:最好的方法是从每个按钮调用控制器中的某些动作。
@Html.ActionLink(\"Insert\",\"Insert\")
要么
@Html.ActionLink(\"Edit\",\"Edit\",new{Id=lineId}).
然后,当用户单击此链接时,他将进入正确的视图,可以处理该任务。