假设我将url存储在数据库中,现在我希望我的表单操作属性或ActionLink url应指向存储在我的数据库中的url。当我们使用ActionLink时,我们指定控制器&当我们使用@ Html.BeginForm()时,动作方法名称和方法相同,然后我们还指定controller&动作方法名称。那么我们如何定制ActionLink&的代码呢?因此,BeginForm()应始终指向存储在数据库中的url。请指导我的概念。感谢
答案 0 :(得分:5)
如果要使用存储在数据库中的网址,为什么要使用ActionLink或BeginForm帮助程序?
<a href="@Model.UrlComingFromYourDatabase">Click me</a>
看起来很好。这些帮助程序旨在通过提供控制器和操作名称来组成URL。
答案 1 :(得分:2)
对我来说,只是将html标签与模型放在一起太简洁了我会更喜欢创建一个自定义的html帮助器,它将封装标签后面的逻辑渲染,你可以看看mvc代码here,但是它可能是这样的:
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;
}