3

画面に出力されるデータのリストがあります。画面の下部(スクロールあり)に、ユーザーがデータを入力できるテキストフィールドのあるフォームがあります。[送信]をクリックしてフォームが無効な場合、エラーは正しく表示されますが、ユーザーは現在探しています。ページの最上部にあります。したがって、ページの下部にエラーがあることはわかりません。ユーザーがエラーが発生したことを確認できるように、ページの下部にあるフォームにジャンプしてほしいと思います。

アンカーの使用を考えましたが、問題は次のとおりです。フォームが無効であることに気付いたとき、私はすでにコントローラーにいるので、URLにハッシュタグを付けて同じコントローラーにリダイレクトする必要があります。私には、これは良い習慣や少しの無駄のようには見えません。

誰かがこれを行うためのより良い方法を知っていますか?

4

2 に答える 2

3

これを行う1つの方法は、常にアンカーに投稿し、ビューでアンカーを配置する場所を決定することです。モデルエラーがある場合は、名前付きアンカーをページの下部に配置し、エラーがない場合は、アンカーをページの上部に配置します。これを複雑にしていることの1つは、アンカーを取得するHtml.BeginFormオーバーロードがないことです。あなたはこのように簡単にそれを達成することができます

<form action="@Url.Action("actionName", "controllerName")#anchor_name" method="post">

    ..... form contents .....

</form>

または、カスタムHTMLヘルパーを作成することもできます

public static class FormExtensions
{
    public static MvcForm CustomBeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName, string fragment)
    {
        var formAction = UrlHelper.GenerateUrl(null, actionName, controllerName, htmlHelper.ViewContext.HttpContext.Request.Url.Scheme, null, fragment, null, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true);
        var builder = new TagBuilder("form");
        builder.MergeAttribute("action", formAction);
        builder.MergeAttribute("method", "post", true);
        htmlHelper.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag));
        return new MvcForm(htmlHelper.ViewContext);
    }
}

その後、あなたは使用することができます@Html.CustomBeginForm('action', 'controller', 'anchor_name')

この質問は役に立ち、私の答えを教えてくれました

于 2012-08-08T07:01:39.390 に答える
1
 public static MvcForm BeginFormAnchor(this HtmlHelper htmlHelper, string actionName, string controllerName, object routeValues, FormMethod method, object htmlAttributes, string hashTag)
    {
        var formAction = UrlHelper.GenerateUrl(null, actionName, controllerName, htmlHelper.ViewContext.HttpContext.Request.Url.Scheme, null, hashTag, ConvertToRouteValueDictionary(routeValues), htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true);
        var builder = new TagBuilder("form");
        builder.MergeAttribute("action", formAction);
        builder.MergeAttribute("method", method.ToString(), true);
        foreach (KeyValuePair<string, string> attribute in ConvertToDictionaryStringString(htmlAttributes))
        {
            builder.MergeAttribute(attribute.Key, attribute.Value);
        }
        htmlHelper.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag));
        return new MvcForm(htmlHelper.ViewContext);
    }

    private static Dictionary<string, string> ConvertToDictionaryStringString(object obj)
    {
        return obj.GetType().GetProperties().ToDictionary(o => o.Name, o => o.GetValue(obj, null).ToString());
    }

    private static RouteValueDictionary ConvertToRouteValueDictionary(object obj)
    {
        RouteValueDictionary rvd = new RouteValueDictionary();
        PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
        foreach (PropertyDescriptor prop in props)
        {
            rvd.Add(prop.Name, prop.GetValue(obj));
        }
        return rvd;
    }

私はそれを次のような形で呼んでいます:

@using (Html.BeginFormAnchor("Action", "Controller", new { id = Model.ID }, FormMethod.Post, new { @id = "formID" }, "anchorName"))
于 2012-08-10T00:32:38.493 に答える