一般的な方法で、コントローラーから特定のモデルプロパティに焦点を当てるビューを取得する方法が必要です。
私がこれまでに持っているものは次のとおりです。
コントローラ:
// To become an extension/base class method
private void FocusOnField<TModel, TProperty>(Expression<Func<TModel, TProperty>> fieldExpression)
{
ViewData["FieldToFocus"] = fieldExpression;
}
...
FocusOnField((ConcreteModelClass m) => m.MyProperty);
意見
public static class ViewPageExtensions
{
public static MvcHtmlString FocusScript<TModel>(this ViewPage<TModel> viewPage)
{
if (viewPage.ViewData["FieldToFocus"] != null)
{
return MvcHtmlString.Create(
@"<script type=""text/javascript"" language=""javascript"">
$(document).ready(function() {
setTimeout(function() {
$('#" + viewPage.Html.IdFor((System.Linq.Expressions.Expression<Func<TModel, object>>)viewPage.ViewData["FieldToFocus"]) + @"').focus();
}, 500);
});
</script>");
}
else
{
return MvcHtmlString.Empty;
}
}
}
私が今直面している問題は、ビューのFocusScript
メソッドで、フォーカスするプロパティの戻りタイプがわからないことと(System.Linq.Expressions.Expression<Func<TModel, object>>)
、オブジェクトを返さないプロパティに対してキャストが失敗することです。
コントローラーがフォーカスしたいプロパティの戻りタイプがわからないため、プロパティの2番目のジェネリックパラメーターを追加することはできません。
ビュー拡張メソッドFocusScript
を一般的な方法で記述して、さまざまな戻り値タイプのプロパティで使用できるようにするにはどうすればよいですか?
なぜ問題があるのですか?
コントローラーでフォーカスしたいコントロールのIDを渡すだけで、JavaScriptにそのIDを読み取らせ、コントロールを見つけてフォーカスさせることができます。ただし、ビューに属するもの(コントロールのID)をコントローラーにハードコーディングするのは好きではありません。メソッドに必要なプロパティを伝えたいので、ビューが通常コントロールのIDを取得/作成するのと同じ方法で使用するIDを知っている必要があります。
私がモデルを持っているとしましょう:
class MyModel
{
public int IntProperty { get; set; }
public string StringProperty { get; set; }
}
コントローラのさまざまな場所で、1つの異なるフィールドに焦点を当てたいと思います。
FocusOnField((MyModel m) => m.IntProperty);
...
FocusOnField((MyModel m) => m.StringProperty);
ここで、前者の場合、式は整数を返す関数であり、後者の場合、式は文字列を返します。結果として、ViewData ["FieldToFocus"]を(に渡すためにIdFor<>()
)何にキャストするかがわかりません。これは、プロパティによって異なるためです。