假设我将 url 存储在数据库中,现在我希望我的表单操作属性或 ActionLink url 应该指向存储在我的数据库中的 url。当我们使用 ActionLink 时,我们指定控制器和操作方法名称,当我们使用 @Html.BeginForm() 时,我们还指定控制器和操作方法名称。那么我们如何自定义 ActionLink 和 BeginForm() 的代码,因为它应该始终指向存储在数据库中的 url。请用概念指导我。谢谢
问问题
719 次
2 回答
5
如果要使用存储在数据库中的 url,为什么要使用 ActionLink 或 BeginForm 助手?
<a href="@Model.UrlComingFromYourDatabase">Click me</a>
似乎很好。这些帮助程序旨在通过提供控制器和操作名称来组成 url。
于 2013-10-01T13:50:54.943 回答
2
对我来说,只是将 html 标记与模型一起放置太冗长了,我更愿意创建一个自定义 html 帮助器,它将封装标记呈现背后的逻辑,您可以在此处查看 mvc 代码,但它可能是这样的:
private static MvcForm MyFormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
{
//you can use service locator for getting your database artifacts
//place your custom logic
TagBuilder tagBuilder = new TagBuilder("form");
tagBuilder.MergeAttributes(htmlAttributes);
// action is implicitly generated, so htmlAttributes take precedence.
tagBuilder.MergeAttribute("action", formAction);
// method is an explicit parameter, so it takes precedence over the htmlAttributes.
tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
bool traditionalJavascriptEnabled = htmlHelper.ViewContext.ClientValidationEnabled
&& !htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled;
if (traditionalJavascriptEnabled)
{
// forms must have an ID for client validation
tagBuilder.GenerateId(htmlHelper.ViewContext.FormIdGenerator());
}
htmlHelper.ViewContext.Writer.Write(tagBuilder.ToString(TagRenderMode.StartTag));
MvcForm theForm = new MvcForm(htmlHelper.ViewContext);
if (traditionalJavascriptEnabled)
{
htmlHelper.ViewContext.FormContext.FormId = tagBuilder.Attributes["id"];
}
return theForm;
}
于 2013-10-01T14:00:09.543 回答