2014-10-19 4 views
0

Я создал эшафот, основанный на одной из моих таблиц. Теперь я пытаюсь понять, как разрешить пользователю просматривать или редактировать данные, идентичные их идентификатору пользователя.MVC5: Позволяет пользователю просматривать и редактировать свою собственную информацию.

Теперь он отображает все данные из этой таблицы и позволяет редактировать всех пользователей. Мне нужно ограничить его только пользователем, который в настоящий момент вошёл в систему.

Пожалуйста, дайте мне знать, если я могу дать более подробную информацию.

Контроллер

public class ClientViewStaffController : Controller 
{ 
    private TpsEntities db = new TpsEntities(); 

    // GET: ClientViewStaff 
    public ActionResult Index() 
    { 
     return View(db.staffTables.ToList()); 
    } 

    // GET: ClientViewStaff/Details/5 
    public ActionResult Details(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     staffTable staffTable = db.staffTables.Find(id); 
     if (staffTable == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(staffTable); 
    } 

    // GET: ClientViewStaff/Create 
    public ActionResult Create() 
    { 
     return View(); 
    } 

    // POST: ClientViewStaff/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "staffID,staffFirstName,staffLastName,staffTitle,staffAddress,staffCity,staffState,staffZip,staffExperience,staffEducation,desiredSalary,staffProfession,staffAvailibity,staffPhoto,staffEmail,staffPhoneNum,userID")] staffTable staffTable) 
    { 
     if (ModelState.IsValid) 
     { 
      db.staffTables.Add(staffTable); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(staffTable); 
    } 

    // GET: ClientViewStaff/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     staffTable staffTable = db.staffTables.Find(id); 
     if (staffTable == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(staffTable); 
    } 

    // POST: ClientViewStaff/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "staffID,staffFirstName,staffLastName,staffTitle,staffAddress,staffCity,staffState,staffZip,staffExperience,staffEducation,desiredSalary,staffProfession,staffAvailibity,staffPhoto,staffEmail,staffPhoneNum,userID")] staffTable staffTable) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(staffTable).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(staffTable); 
    } 

    // GET: ClientViewStaff/Delete/5 
    public ActionResult Delete(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     staffTable staffTable = db.staffTables.Find(id); 
     if (staffTable == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(staffTable); 
    } 

    // POST: ClientViewStaff/Delete/5 
    [HttpPost, ActionName("Delete")] 
    [ValidateAntiForgeryToken] 
    public ActionResult DeleteConfirmed(int id) 
    { 
     staffTable staffTable = db.staffTables.Find(id); 
     db.staffTables.Remove(staffTable); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

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

View (Index.cshtml)

<table class="table"> 
<tr> 
    <th> 
     First Name 
    </th> 
    <th> 
     Last Name 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.staffState) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.staffExperience) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.staffEducation) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.desiredSalary) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.staffProfession) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.staffAvailibity) 
    </th> 
    <th></th> 
</tr> 

@foreach (var item in Model) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.staffFirstName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.staffLastName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.staffState) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.staffExperience) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.staffEducation) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.desiredSalary) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.staffProfession) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.staffAvailibity) 
     </td> 
     <td> 
      @Html.ActionLink("Details", "Details", new { id = item.staffID }) | 

     </td> 
    </tr> 
} 

View (Details.cshtml)

<div> 
<h4>Staff View</h4> 
<hr /> 
<dl class="dl-horizontal"> 
    <dt> 
     First Name 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffFirstName) 
    </dd> 

    <dt> 
     Last Name 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffLastName) 
    </dd> 

    <dt> 
     Title 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffTitle) 
    </dd> 

    <dt> 
     Address 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffAddress) 
    </dd> 

    <dt> 
     City 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffCity) 
    </dd> 

    <dt> 
     State 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffState) 
    </dd> 

    <dt> 
     Zip Code 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffZip) 
    </dd> 

    <dt> 
     Experience 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffExperience) 
    </dd> 

    <dt> 
     Education 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffEducation) 
    </dd> 

    <dt> 
     Salary 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.desiredSalary) 
    </dd> 

    <dt> 
     Profession 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffProfession) 
    </dd> 

    <dt> 
     Availability 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffAvailibity) 
    </dd> 

    <dt> 
     Photo 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffPhoto) 
    </dd> 

    <dt> 
     Email 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffEmail) 
    </dd> 

    <dt> 
     Phone Number 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.staffPhoneNum) 
    </dd> 

    <dt> 
     User ID 
    </dt> 

    <dd> 
     @Html.DisplayFor(model => model.userID) 
    </dd> 

</dl> 
</div> 
<p> 
    @Html.ActionLink("Edit", "Edit", new { id = Model.staffID }) | 
    @Html.ActionLink("Back to List", "Index") 
</p> 
+0

Couldyou предоставляет некоторые детали вашей модели домена? –

+0

Мне никогда не приходилось объяснять это раньше, поэтому, пожалуйста, со мной. I Настройка, просмотр моделей, контроллеров. Я создаю проект с использованием шаблона MVC 5 от MS и отбрасываю то, что мне не нужно. Я использовал индивидуальную проверку подлинности, поскольку я подключен к моему SQL-серверу (не локальному). Model.edmx есть ... Позвольте мне знать, что конкретно вы просите, но немного к этому. – slider1578

+0

Используете ли вы систему идентификации asp.net для аутентификации? Если вы счастливы использовать опцию display/hide для своей кнопки редактирования, я могу дать вам легкое решение. – DSR

ответ

1

Вы можете реализовать что-то подобное в действии GET Edit, Details.

var loggedInUser = GetUserId(HttpContext.Current.User.Identity.Name); 
if (id != loggedInUser) 
{ 
    return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
} 

Вы также можете отвлечь это от контроллера и поместить в фильтр действий. Фильтры действий в ASP.NET MVC являются атрибутами C#, которые разделяют определенные проблемы, такие как безопасность.

1

Украсьте Редактировать действие с [Авторизоваться] атрибут

[Authorize] 
public ActionResult Edit(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    staffTable staffTable = db.staffTables.Find(id); 
    if (staffTable == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(staffTable); 
} 

Затем скрыть действие редактирования для не зарегистрированных пользователей.

Сначала добавьте @using Microsoft.AspNet.Identity в начало вашего просмотра, а затем используйте нижеследующий код для просмотра.

@if (Request.IsAuthenticated) 
{ 
    @Html.ActionLink("Edit", "Edit", new { id = Model.staffID }) 
} 

Edited для комментария

Как вы знаете, что все, что вам нужно ограничить не прошедшие проверку подлинности пользователей (не вошли в систему), вы должны использовать [Авторизовать] атрибут, как я уже говорил.

Вы не указали, что именно вы ограничиваете доступ в своем вопросе.

Если вы хотите ограничить доступ ко всем своим контентом для пользователя без аутентификации, добавьте атрибут [Авторизовать] на свой контроллер, как показано ниже.

[Authorize] 
public class ClientViewStaffController : Controller 
{ 

} 

Тогда все действия ограничены для входа в систему только для пользователей. Это то, что вы ищете?

+0

Есть ли способ ограничить результаты только персоналом персонала. В настоящее время я загружаю его, вытягивая всех из БД и предоставляя параметр редактирования. Я хотел бы ограничить результат только тем, кто вошел в систему. Существует index.cshtml, который тянет все – slider1578

+0

Выполнено, но не работает – slider1578

+0

Проверьте отредактированный ответ. – DSR

1

Я думаю, что у вас что-то отсутствует в инфраструктуре сущности в сочетании с Linq aka Linq-to-entity.

Вы можете писать запросы по вашей модели ef с помощью Linq. Подробнее см. MSDN.

Что вы делаете в основном в написании запроса в C#, а структура сущности преобразует этот запрос в оператор select sql и запускает его против вашей базы данных.

Используя этот подход, ваш вопрос станет реальным простым. Просто напишите запрос, который соответствует вашим потребностям. Нечто подобное может работать

public IEnumerable<> FetchData(string userId) 
{ 
    return (
     from item in this.db.staffTables 
     where item.UserId == userId 
     select item 
     ).ToArray(); 
} 

гораздо лучший подход был бы скрыть Entity Framework модель от контроллера и использовать хранилище между ними. Репозиторий обычно реализует четыре функции: GetData()', 'Create()', 'Update() и Delete(). В каждом методе вы должны проверить, разрешен ли пользователь для выполнения действия или возврата только тех данных, которые пользователь имеет право получить.

Смежные вопросы