मैं एक ईएफ आवेदन में भूमिकाओं को लागू करने की कोशिश कर रहा हूँ। मेरे पास यह सभी मचान दृश्यों (बनाएं, हटाएं, विवरण) पर काम कर रहा है, लेकिन मुझे काम करने के लिए Edit दृश्य प्राप्त करने में परेशानी हो रही है।

GET विधि डेटा को ठीक लौटाती है (जैसे कि जब मैं संपादन पृष्ठ पर जाता हूं तो मुझे भूमिकाएं सही दिखाई देती हैं):

यहां छवि विवरण दर्ज करें हालांकि, अगर मैं कोई बदलाव करता हूं और इसे सहेजता हूं, तो मुझे त्रुटि मिलती है:

ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट की आवृत्ति पर सेट नहीं है।
लाइन 47: @Html.Label("Roles", new {@class = "control-label col-md-2" })
पंक्ति 48: < अवधि वर्ग = "col-md-10" >
पंक्ति 49: @foreach (Model.RolesList में var आइटम)
लाइन 50: {
पंक्ति 51: <इनपुट प्रकार = "चेकबॉक्स" नाम = "चयनित भूमिका" मान = "@ आइटम। मान"
check="@item.Selected" class="checkbox-inline" />

मेरी Get और Post विधियां इस प्रकार हैं:

//
// GET: /Users/Edit/1
public async Task<ActionResult> Edit(string id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    var user = await UserManager.FindByIdAsync(id);
    if (user == null)
    {
        return HttpNotFound();
    }

    var userRoles = await UserManager.GetRolesAsync(user.Id);

    return View(new EditUserViewModel()
    {
        Id = user.Id,
        Email = user.Email,
        Username = user.UserName,
        FirstName = user.FirstName,
        LastName = user.LastName,

        RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
        {
            Selected = userRoles.Contains(x.Name),
            Text = x.Name,
            Value = x.Name
        })

    });
}

//
// POST: /Users/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "Email,Id,Username,FirstName,LastName")] EditUserViewModel editUser, params string[] selectedRole)
{
    if (ModelState.IsValid)
    {
        var user = await UserManager.FindByIdAsync(editUser.Id);
        if (user == null)
        {
            return HttpNotFound();
        }

        user.UserName = editUser.Username;
        user.Email = editUser.Email;
        user.FirstName = editUser.FirstName;
        user.LastName = editUser.LastName;

        var userRoles = await UserManager.GetRolesAsync(user.Id);

        selectedRole = selectedRole ?? new string[] { };

        var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(userRoles).ToArray<string>());

        if (!result.Succeeded)
        {
            ModelState.AddModelError("", result.Errors.First());
            return View();
        }
        result = await UserManager.RemoveFromRolesAsync(user.Id, userRoles.Except(selectedRole).ToArray<string>());

        if (!result.Succeeded)
        {
            ModelState.AddModelError("", result.Errors.First());
            return View();
        }
        return RedirectToAction("Index");
    }
    ModelState.AddModelError("", "Something failed.");
    return View();
}

और मेरे विचार में आपत्तिजनक खंड है:

<div class="form-group">
    @Html.Label("Roles", new { @class = "control-label col-md-2" })
    <span class="col-md-10">
        @foreach (var item in Model.RolesList)
        {
            <input type="checkbox" name="SelectedRole" value="@item.Value" checked="@item.Selected" class="checkbox-inline" />
            @Html.Label(item.Value, new { @class = "control-label" })
        }
    </span>
</div>

मेरे पास मेरे नियंत्रक में rolemanager सेट अप है:

private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager
{
    get
    {
        return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
    }
    private set
    {
        _roleManager = value;
    }
}

और यह मेरे Startup.auth में है:

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

मुझे पूरा विश्वास है कि rolemanager ठीक सेट अप है, क्योंकि यह Create और Details पृष्ठों पर भूमिकाओं को सफलतापूर्वक वापस लाता है। तो क्यों है

@foreach (var item in Model.RolesList)

यहाँ एक अशक्त संदर्भ अपवाद के साथ विफल?

4
Ben 11 अगस्त 2017, 02:30

1 उत्तर

संपादित करें [HttpPost] विधि मॉडल वापस नहीं करती है:

return View();

होना चाहिए

return View(editUser);

साथ ही, आपको यह सुनिश्चित करना होगा कि editUser में एक selectedRole गुण है, अन्यथा आपको वही (या समान) त्रुटि मिलेगी।

अन्यथा, एक नया EditUserViewModel ऑब्जेक्ट बनाएं और वापस करें जैसा आपने गेट विधि में किया है।

1
K Scandrett 14 अगस्त 2017, 02:47