0

假设我将 url 存储在数据库中,现在我希望我的表单操作属性或 ActionLink url 应该指向存储在我的数据库中的 url。当我们使用 ActionLink 时,我们指定控制器和操作方法名称,当我们使用 @Html.BeginForm() 时,我们还指定控制器和操作方法名称。那么我们如何自定义 ActionLink 和 BeginForm() 的代码,因为它应该始终指向存储在数据库中的 url。请用概念指导我。谢谢

4

2 回答 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 回答