web-dev-qa-db-ja.com

部分ビューにパラメーターを渡しますか?

私はこのような部分ビューを呼び出しています:

 <% Html.RenderPartial("~/controls/users.ascx"); %>

部分ビューにパラメーターを渡すことはできますか?実際のusers.ascxページでどのようにアクセスしますか?

33
mrblah

モデルオブジェクトをパーシャルに渡すことができます(たとえば、文字列のリスト):

<% Html.RenderPartial("~/controls/users.ascx", new string[] { "foo", "bar" }); %>

次に、パーシャルを強く入力すると、Modelプロパティは適切なタイプになります。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Collections.Generic.IEnumerable<string>>" %>

<% foreach (var item in Model) { %>
    <div><%= Html.Encode(item) %></div>
<% } %>
31
Darin Dimitrov

モデルを通過させるRenderPartialには別のオーバーロードがあります。

<% Html.RenderPartial("~/controls/users.ascx", modelGoesHere); %>

アクセス方法通常のビューと同じように:

<%= Model.MagicSauce %>
17
John Farrell

沈むには時間がかかりましたが、MVCでは、部分ビューを含むほぼすべての目的で、モデル、ビュー、コントローラーを何らかの方法で使用します。 3つの要素すべてがどのように適合するかは、最初は少し怖いかもしれません。私は今までやったことがありませんでした、そしてそれは動作します-

これが次の人の助けになることを願っています。申し訳ありませんが、.Netフォームの代わりにカミソリを使用しています。また、SQL ServerデータベースからEntity Frameworkにデータをプルします。これは開発者が使用する可能性があります。また、おそらくforgridステートメントよりもはるかにエレガントなWebGridを少し使いすぎました。基本的な@ webgrid.GetHtml()は、すべての列と行を表示します。

バックグラウンド

この作業例では、ユーザーが写真をアップロードしています。それらの写真は、部分ビューを使用して編集フォームに表示されます。 ImageIDおよびFileNameメタデータはSQL Serverに保持され、ファイル自体は〜/ Content/UserPicturesディレクトリに保持されます。

個人データのアップロードと編集のすべての詳細が表示されていないので、私はそれが半分広大であることを知っています。一部のボーナスEFが投入されていますが、パーシャルビューの使用の重要な部分に焦点が当てられています。名前空間はS&GのMVCApp3です。

部分ビューモデル ViewModels.cs

SQL Server Imagesテーブルには、ImageIDとFileNameに加えて、[Caption]、[Description]、同じ画像が複数回アップロードされないようにするMD5ハッシュ、アップロード日など、さらに多くの列が含まれます。 ViewModelは、ユーザーが写真を表示するために必要な最低限までエンティティを抽出します。

public class Picts
{
    public int ImageID { get; set; }
    public string FileName { get; set; }
}

メインビュービュー Edit.cshtml

ViewData []を厳密に入力するキャスト/変換に注意してください。

 @Html.Partial(
      partialViewName: "Picts", 
      model: (IEnumerable<MVCApp3.Models.Picts>)ViewData["Picts"]
 )

部分型ビューに使用するように厳密に型指定されたモデルを設定しない場合、「」が取得されます。辞書に渡されるモデル項目は、タイプ 'System.Data.Entity.DynamicProxiesです... "エラーは、親/マスターモデルを渡そうとしているためです。

部分表示ビュー Picts.cshtml(ファイルの内容全体が表示されます)

@model IEnumerable<MVCApp3.Models.Picts>
@{
    var pictsgrid = new WebGrid(Model);
}
    @pictsgrid.GetHtml(
        tableStyle: "grid",
        displayHeader: false,
        alternatingRowStyle: "alt",
        columns: pictsgrid.Columns( 
            pictsgrid.Column(format:@<text><img src="@Url.Content("~/Content/Users/" + @item.FileName)" alt="@item.ImageID" width="200" />
            @Html.ActionLink(linkText: "Delete", actionName: "DeletePicture", routeValues: new { id = @item.ImageID })
            </text>)
            ))

コントローラー IdentityController.cs

データコンテンツを部分ビューが消費するViewData ["MyPartialViewModelKeyName"]に設定します。辞書キーには任意の名前を付けることができますが、ViewData ["Picts"]という名前を付けて、部分的なビューファイル名とそのビューモデルクラス定義との一貫性を確保しています。

画像は複数のユーザー間で共有される可能性があるため、Entity Frameworkには、ネストされたfromと内部結合を使用してユーザーに属する、または共有される画像のみを返す対応するPITAクエリを含む多対多のテーブルがあります:

public class IdentityController : Controller
{
    private EzPL8Entities db = new EzPL8Entities();

    // GET: /Identity/Edit/5
    [Authorize]
    public ActionResult Edit(int? id)
    {

        if (id == null)
            return new HttpNotFoundResult("This doesn't exist");

      // get main form data
      ezpl8_UsersPhysicalIdentity ezIDobj = db.ezpl8_UsersPhysicalIdentity.Find(id)

    // http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/
    // get partial form data for just this user's pictures
                ViewData["Picts"] = (from user in db.ezpl8_Users
                             from ui in user.ezpl8_Images
                             join image in db.ezpl8_Images
                             on ui.ImageID equals image.ImageID
                             where user.ezpl8_UserID == id
                             select new Picts
                             {
                                 FileName = image.FileName,
                                 ImageID = image.ImageID
                             }
                                 ).ToList();

        return View(ezIDobj);
    }

   //  Here's the Partial View Controller --not much to it!
    public ViewResult Picts(int id)
    {
       return View(ViewData["Picts"]);
    }

    [Authorize]  //you have to at least be logged on
    public ActionResult DeletePicture(int id)
    {
        //ToDo:  better security so a user can't delete another user's picture 
        //    TempData["ezpl8_UserID"]
        ezpl8_Images i = db.ezpl8_Images.Find(id);
        if (i != null)
        {
            var path = System.IO.Path.Combine(Server.MapPath("~/Content/Users"), i.FileName);
            System.IO.File.Delete(path: path);

            db.ezpl8_Images.Remove(i);
            db.SaveChanges();
        }
        return Redirect(Request.UrlReferrer.ToString());
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}
6
Jules Bartow
// get main form data
ezpl8_UsersPhysicalIdentity ezIDobj = db.ezpl8_UsersPhysicalIdentity.Find(id)

// http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/
// get partial form data for just this user's pictures
            ViewData["Picts"] = (from user in db.ezpl8_Users
                         from ui in user.ezpl8_Images
                         join image in db.ezpl8_Images
                         on ui.ImageID equals image.ImageID
                         where user.ezpl8_UserID == id
                         select new Picts
                         {
                             FileName = image.FileName,
                             ImageID = image.ImageID
                         }
                             ).ToList();

    return View(ezIDobj);
}

//ここにパーシャルビューコントローラがあります-それは大したことではありません! public ViewResult Picts(int id){View(ViewData ["Picts"])を返す; }

[Authorize]  //you have to at least be logged on
public ActionResult DeletePicture(int id)
{
    //ToDo:  better security so a user can't delete another user's picture 
    //    TempData["ezpl8_UserID"]
    ezpl8_Images i = db.ezpl8_Images.Find(id);
    if (i != null)
    {
        var path = System.IO.Path.Combine(Server.MapPath("~/Content/Users"), i.FileName);
        System.IO.File.Delete(path: path);

        db.ezpl8_Images.Remove(i);
        db.SaveChanges();
    }
    return Redirect(Request.UrlReferrer.ToString());
}

protected override void Dispose(bool disposing)
{
    db.Dispose();
    base.Dispose(disposing);
}

}

0
user2689416