28

私は、mvc Web サイトが jquery を介して html を取り込み、指定された div を作成するための簡単なメカニズムを開発しました。すべてが順調で、クールに見えます。
私の問題は、コントローラー内でhtmlマークアップを作成していることです(VB.netで行うのは非常に簡単です)。懸念の分離を混同したくありません。

このニーズに合わせてカスタム 'MVC ビュー ユーザー コントロール' を使用することは可能ですか? コントロールのインスタンスを作成し、モデル データを渡して html にレンダリングすることはできますか? その後、レンダリングして呼び出し元のブラウザーに戻すという単純な問題になります。

4

10 に答える 10

8

MVC ベータ版のコントローラー メソッドからビューを文字列にレンダリングできる大まかなフレームワークをまとめました。これは、現時点ではこの制限を解決するのに役立ちます。

さらに、Rails に似た RJS javascript 生成フレームワークを MVC Beta 用にまとめました。

http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvcでチェックして、感想を教えてください。

于 2008-11-16T23:26:03.183 に答える
7

次のようにアクションを作成します。

        public PartialViewResult LoginForm()
        {
            var model = // get model data from somewhere
            return PartialView(model);
        }

そして、アクションは、レンダリングされた部分ビューを jquery 応答に返します。

jquery は次のようになります。

$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});
于 2008-11-13T06:36:32.387 に答える
5

jquery を使用して div を設定 (および必要に応じて新しい html 要素を作成) し、ActionResult の Json シリアル化を使用する必要があります。

他の方法は、jquery を使用してコントローラー/アクションを呼び出すことですが、代わりに json が通常のビュー (aspx または ascx、Web フォーム ビュー エンジン) を使用してコンテンツをレンダリングし、jquery を使用してその html を div に挿入するだけです。これは、asp.net ajax から UpdatePanels への途中です...

私はおそらく最初の方法であるjsonを使用しますが、これ以上の仕事はほとんどありませんが、html全体をネットワーク経由で転送するのではなく、シリアル化されたオブジェクトだけがあるため、はるかに「最適化」されています。これは、「大きなもの」(gmail、g docs、hotmail など) が行う方法です。UI を操作する多くの JS コードです。

ajax が必要ない場合、基本的に部分ビューを呼び出す方法は 2 つあります。

  • html.renderpartial("ascx の名前")
  • Microsoft.web.mvc (mvc 先物) からの html.RenderAction(x=>x.ActionName)
于 2008-11-13T09:32:02.297 に答える
4

グーグルで掘り下げた後、私は答えを見つけました。ビューによって出力された html に簡単にアクセスすることはできません。

http://ayende.com/Blog/archive/2008/11/11/another-asp.net-mvc-bug-rendering-views-to-different-output-source.aspx

于 2008-11-13T05:16:27.367 に答える
3

私が取り組んでいるアプリに対して同様のことをしました。レンダリングされたコンテンツを返す部分ビューがあり、REST パスを使用するか、次を使用して呼び出すことができます。

<% Html.RenderAction("Action", "Controller"); %>

次に、実際の表示 HTML には、jQuery から入力された DIV があります。

<div class="onload">/controller/action</div>

jQuery は次のようになります。

<script type="text/javascript">
    $.ajaxSetup({ cache: false });

    $(document).ready(function () {
        $('div.onload').each(function () {
            var source = $(this).html();
            if (source != "") {
                $(this).load(source);
            }
        });
    });
</script>

これにより、「onload」クラスに一致するすべての DIV がスキャンされ、そのコンテンツから REST パスが読み取られます。次に、その REST パスで jQuery.load を実行し、結果を DIV に入力します。

すみません、私の車に乗って家に帰ります。詳しく説明してほしい場合はお知らせください。

于 2010-07-21T05:01:03.663 に答える
2

いくつかのオプションがあります。

ビューのコントローラーに MVC ビュー ユーザー コントロールとアクション ハンドラーを作成します。ビューをレンダリングするには

<% Html.RenderPartial("MyControl") %>

この場合、アクション ハンドラはモデル データをビューに渡す必要があります。

public ActionResult MyControl ()
{
    // get modelData

    render View (modelData);
}

もう 1 つのオプションは、親ページからモデル データを渡すことです。この場合、アクション ハンドラーは必要なく、モデル タイプは親と同じです。

<% Html.RenderPartial("MyControl", ViewData.Model) %>

ユーザー コントロールに独自のデータ型がある場合は、ページ内で構築することもできます

MyControl.ascx.cs:

public class MyControlViewData
{
    public string Name { get; set; }
    public string Email { get; set; }
}

public partial class MyControl : System.Web.Mvc.ViewUserControl <MyControlViewData>
{
}

ページで、コントロールのデータ モデルを初期化できます。

<% Html.RenderPartial("MyControl", new MyControlViewData ()
   {
        Name= ViewData.Model.FirstName,
        Email = ViewData.Model.Email,
   });
 %>
于 2008-11-17T01:16:17.407 に答える
0

強く型付けされた部分ビュー (またはユーザー コントロール) を作成する必要があるのは非常に簡単です。次に、コトローラーで次のようにします。

public PartialViewResult yourpartialviewresult()
{
    var yourModel
    return PartialView("yourPartialView", yourModel);
}

その後、必要なときに JQuery を使用してリクエストを実行できます。

$.ajax({
    type: 'GET',
    url: '/home/yourpartialviewresult',
    dataType: 'html', //be sure to use html dataType
    contentType: 'application/json; charset=utf-8',
    success: function(data){
         $(container).html(data);
    },
    complete: function(){ }
 });    
于 2013-01-11T18:22:53.407 に答える
0

Rails では、これを部分ビューのレンダリングと呼び、 で行いますrender :partial => 'yourfilename'。ASP.NET MVCにも同様のRenderPartial方法があると思いますが、MVCの公式ドキュメントでそのようなことを確認または拒否することはできません。

于 2008-11-13T03:27:38.147 に答える