Cách mà điều này được thực hiện với BeginForm là kiểu trả về MvcForm
impliments IDisposable
để khi sử dụng trong một tuyên bố using
, các Dispose
phương pháp MvcForm
ghi thẻ đóng </form>
.
Bạn có thể viết một phương thức tiện ích mở rộng thực hiện chính xác điều tương tự.
Đây là bài tôi vừa viết để minh họa.
Trước hết, các phương pháp khuyến nông:
public static class ExtensionTest
{
public static MvcAnchor BeginLink(this HtmlHelper htmlHelper)
{
var tagBuilder = new TagBuilder("a");
htmlHelper.ViewContext.Writer
.Write(tagBuilder.ToString(
TagRenderMode.StartTag));
return new MvcAnchor(htmlHelper.ViewContext);
}
}
Và đây là loại mới của chúng tôi, MvcAnchor:
public class MvcAnchor : IDisposable
{
private readonly TextWriter _writer;
public MvcAnchor(ViewContext viewContext)
{
_writer = viewContext.Writer;
}
public void Dispose()
{
this._writer.Write("</a>");
}
}
Trong quan điểm của bạn bây giờ bạn có thể làm:
@{
using (Html.BeginLink())
{
@Html.Raw("Hello World")
}
}
Kết quả này mang lại kết quả:
<a>Hello World</a>
Mở rộng này hơi để đối phó với yêu cầu chính xác của bạn:
public static MvcAnchor BeginLink(this HtmlHelper htmlHelper,
string href,
string title)
{
var tagBuilder = new TagBuilder("a");
tagBuilder.Attributes.Add("href",href);
tagBuilder.Attributes.Add("title", title);
htmlHelper.ViewContext.Writer.Write(tagBuilder
.ToString(TagRenderMode.StartTag));
return new MvcAnchor(htmlHelper.ViewContext);
}
và xem chúng tôi:
@{
using (Html.BeginLink("http://stackoverflow.com", "The Worlds Best Q&A site"))
{
@Html.Raw("StackOverflow - Because we really do care")
}
}
trong đó sản lượng kết quả:
<a href="http://stackoverflow.com" title="The Worlds Best Q&A site">
StackOverflow - Because we really do care</a>
Bạn có hỏi liệu có thể làm điều gì đó như thế này không: '@ Html.ActionLink (" Xin chào Thế giới "," MyAction ")'? – CallumVass
Không phải vậy. Tôi biết có phương pháp BeginForm() và EndForm() để xử lý kiểu kịch bản này nhưng khi thực hiện điều này trên quy mô lớn có thể gây ra vấn đề nếu bạn quên một thẻ kết thúc. – Sanj
Tôi không chắc mình biết ý của bạn là gì?Bạn sẽ không sử dụng 'BeginForm' trong kịch bản này? Bạn sẽ sử dụng 'BeginForm' để tạo biểu mẫu chứ không phải liên kết anchor. – CallumVass