1

非常に単純な作業であるはずなのに問題があります。データベースから取得した値をビューモデルにマッピングしようとしています。次に、それをモデルとしてビューに渡します。

ビューモデルはEditAdminModelVMと呼ばれ、UserProfileと呼ばれる大きなクラスのプロパティの小さなサブセットが含まれています。ユーザーがドメインモデル全体を更新できるようにしたくないので、ビューモデルを使用することにしました。

ViewModelは次のとおりです。

public class EditAdminModelVM
{
    [Required]
    [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.")]
    [Display(Name = "First name")]
    public string FirstName { get; set; }

    [Required]
    [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.")]
    [Display(Name = "Last name")]
    public string LastName { get; set; }

    [Required]
    [MaxLength(250)]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    //[Remote("doesUserNameExist", "Account", HttpMethod = "POST", ErrorMessage = "Username already exists. Please enter a different User Name.")] //note this checks from client-side only - server side check is built in to membership
    [Display(Name = "Username")]
    public string UserName { get; set; }

    [HiddenInput]
    public int UserId { get; set; }
}

これがコントローラー9ですが、動作しません):

[Authorize(Roles = "Admin")]
    public ActionResult EditAdmin(int id = 0)
    {
        PpDB db = new PpDB();

        var viewModel = new EditAdminModelVM();

        viewModel = db.UserProfiles
             .Where(x => x.UserId == id)
             .Select(x => new EditAdminModelVM
             {
                 FirstName = x.FirstName,
                 LastName = x.LastName,
                 Email = x.Email,
                 UserName = x.UserName
             });

        return View(viewModel);
    }

この場合、.Selectには、IQueryableについて何かを示す波線で下線が引かれています。しかし、var viewModel =newIQueryableを設定しようとすると; 別のエラーが発生します。

これは構文上の問題である可能性があると思います。このDBクエリは1行のみを返す必要があるため、IQueryableは必要ないと思いましたが、私は専門家ではありません。

このコードブロックを構築する方法のサンプルを提供していただければ、例を挙げて学ぶことができます。疲れた脳にとってより良い方法です。

とても有難い!

KEN の更新更新されたコントローラーは次のとおりです。

 [Authorize(Roles = "Admin")]
    public ActionResult EditAdmin(int id = 0)
    {
        PpDB db = new PpDB();

        List<EditAdminModelVM> viewModel = new List<EditAdminModelVM>();

        viewModel = db.UserProfiles
             .Where(x => x.UserId == id)
             .Select(x => new EditAdminModelVM
             {
                 FirstName = x.FirstName,
                 LastName = x.LastName,
                 Email = x.Email,
                 UserName = x.UserName,
                 UserId = x.UserId
             }).ToList();

        return View(viewModel);
    }

そしてここにビューがあります:

@model List<PpModels.Models.EditAdminModelVM>


@{
    ViewBag.Title = "Edit Admin";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

<fieldset>
    <legend>UserProfile</legend>

    @Html.HiddenFor(model => model.UserId)

    <div class="editor-label">
        @Html.LabelFor(model => model.UserName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.UserName)
        @Html.ValidationMessageFor(model => model.UserName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.FirstName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.FirstName)
        @Html.ValidationMessageFor(model => model.FirstName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.LastName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.LastName)
        @Html.ValidationMessageFor(model => model.LastName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Email)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Email)
        @Html.ValidationMessageFor(model => model.Email)

    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
4

1 に答える 1

1

クエリの最後に変更var viewModel = new EditAdminModelVM();List<EditAdminModelVM> viewModel = new List<EditAdminModelVM>();て追加します。これで、EditAdminModelVMのコレクションがビューに渡されます。ビューでこのコレクションを繰り返し処理して、目的の出力を取得します。ToList()db.UserProfiles

更新:単一インスタンスの場合:

[Authorize(Roles = "Admin")]
public ActionResult EditAdmin(int id = 0)
{
    PpDB db = new PpDB();

    var viewModel = new EditAdminModelVM();

    viewModel = db.UserProfiles
         .Where(x => x.UserId == id)
         .Select(x => new EditAdminModelVM
         {
             FirstName = x.FirstName,
             LastName = x.LastName,
             Email = x.Email,
             UserName = x.UserName
         }).FirstOrDefault();

    return View(viewModel);
}

このため、ビューで繰り返す必要はありません。

あなたの見解で使用@model ProofPixModels.Models.EditAdminModelVMしてください。

于 2013-03-23T06:16:13.377 に答える