-1

다음과 같은 문제가 있습니다.MVC : DropdownListFor 오류 "람다식이 대리자 형식이 아니기 때문에 'string'을 입력 할 수 없습니다."

Users이라는 테이블이 있는데 Department이라는 테이블이 있습니다.

이제 UI에서 사용자가 사용자 양식을 사용하여 자신을 사용자로 만들 때 Department 테이블에있는 모든 Department 제목을 부서 필드에 드롭 다운 목록으로 표시합니다. 그 이유 : 부서 테이블은 다른 작업에 사용되며 Userdata와 연결하면 안됩니다. 그래서 Userdata는 테이블의 부서명 만 포함하면 충분합니다.

내 컨트롤러는 다음과 같습니다

내 HTML 섹션입니다
public ActionResult UserCreate() 
{ 
    ViewBag.AppDataDepartment = new SelectList(database.department, "department_title", "department_title"); 
    return View(); 
} 

[HttpPost] 
public ActionResult UserCreate(Users user) 
{ 
    if (user.UserID == "" || user.UserID == null) 
    { 
     ModelState.AddModelError(string.Empty, "UserID cannot be blank"); 
    } 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      List<string> results = database.Database.SqlQuery<String>(string.Format("SELECT UserID FROM USERS WHERE UserID = '{0}'", user.UID)).ToList(); 
      bool _userExistsInTable = (results.Count > 0); 
      Users _user = null; 
      if (_userExistsInTable) 
      { 
       _user = database.Users.Where(p => p.UserID == user.UserID).FirstOrDefault(); 
       if (_user != null) 
       { 
        if(_user.active == true) 
        { 
          ModelState.AddModelError(string.Empty, "USER already exists!"); 
        } 
        else 
        { 
         database.Entry(_user).Entity.active = true; 
         database.Entry(_user).Entity.Last_Modified = System.DateTime.Now; 
         database.Entry(_user).State = EntityState.Modified; 
         database.SaveChanges(); 
         return RedirectToAction("Index"); 
        } 
       } 
      } 
      else 
      { 
       _user = new Users(); 
       _user.UserID = user.UserID; 
       _user.lastname = user.lastname; 
       _user.firstname = user.firstname; 
       _user.mail = user.mail; 
       _user.department = user.department; 
       _user.user_image = user.user_image; 
       _user.image_path = user.image_path; 
       if (ModelState.IsValid) 
       { 
        _user.active = true; 
        _user.Last_Modified = System.DateTime.Now; 
        database.Users.Add(_user); 
        database.SaveChanges(); 
        ViewBag.AppDataDepartment = new SelectList(database.department, "department_title", "department_title"); 
        return RedirectToAction("Index"); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     //return base.ShowError(ex); 
    } 
    return View(user); 
} 

:

<div class="row"> 
    @Html.LabelFor(model => model.UserID, "UserID", new { @class = "col-sm-2 control-label" }) 
    <div class="col-md-4"> 
     @Html.TextBoxFor(model => model.UserID, new { @class = "col-md-4 control-label form-control", @id = "inputEmail3" }) 
    </div> 

    @Html.LabelFor(model => model.department, "Department", new { @class = "col-sm-2 control-label" }) 
    <div class="col-md-4"> 
     @Html.DropDownList(model => model.department, (SelectList) ViewBag.AppDataDepartment, htmlAttributes: new { @class = "form-control" }) 
    </div> 
</div> 

그리고 테이블에서 마지막으로 내 부서 클래스 :

[Table("department")] 
public partial class department 
{ 
    [Key] 
    public int departmentid { get; set; } 
    [Required] 
    public string department_title { get; set; } 
    public string subdepartment { get; set; } 
} 

하지만 그럴 수 없어 오류가 발생하여 컴파일하십시오.

Error CS1660 Cannot convert lambda expression to type 'string' because it is not a delegate type BTKPI

왜 작동하지 않습니까? 어떻게 해결할 수 있습니까?

이미이 SolutionProposal을 보았습니다 만, 모델, Linq 및 Data.Entity가 이미 참조 되었기 때문에이 작업이 도움이되지 않았습니다.

그것은 필요
+3

'@ Html.DropDownListFor()'하지'@ Html.DropDownList()' –

+0

@StephenMuecke 감사하지만, 나는 다음과 같은 오류 메시지가 얻을 : 오류 CS1928 \t 'Html 헬퍼 가'DropDownListFor '에 대한 정의를 포함하지 않습니다 '및 최상의 확장 메서드 오버로드'SelectExtensions.DropDownListFor (HtmlHelper , Expression >, IEnumerable , 개체) '에 잘못된 인수가 있습니다. – Azeristar

+0

코드가 너무 깁니다. 무슨 일이든 궁금해. 당신이 바인딩하는 모델은 무엇입니까? (당신이 보여준 것은'class department'이지만'department'라는 속성은 포함되어 있지 않습니다.) –

답변

2

DropDownList()을 사용한다면하지 DropDownList()

@Html.DropDownListFor(m => m.department, (SelectList)ViewBag.AppDataDepartment, new { @class = "form-control" }) 

가, 다음은

@Html.DropDownList("department", (SelectList)ViewBag.AppDataDepartment, new { @class = "form-control" }) 

그러나 코드와 수많은 다른 문제가있는 당신이 해결해야 될 것 DropDownListFor() 될 수 있습니다 .

  1. 컨트롤러는 편집 할 때 데이터 모델을 사용하지 않는 뷰 모델을 (사용해야하므로 URL이, ../User/Create하지 User/UserCreate
  2. 귀하의 편집 데이터가 될 것 UserControllerCreate() 그래서 방법이어야한다 데이터) - What is ViewModel in MVC?, 을 참조하고 뷰 모델에는 IEnumerable<SelectListItem> DepartmentList 속성이 있어야합니다. 일반적인 예로는 this question/answer에 표시된 입니다.
  3. Users 테이블은 상기 DepartmentID, 없는 이름을 기억해야하고 Departments 테이블에 FK 관계가 있어야한다.
  4. UserID위한 당신의보기 모델 속성은 [Required] 속성을 가지고 있어야하고 뷰 그래서 당신은 보테 클라이언트 및 서버 측 유효성 검사합니다 (DepartmentID 속성에 대한 상동) 얻을 @Html.ValidationMesageFor(m => m.UserID)을 포함해야한다.How to: Implement Remote Validation in ASP.NET MVC

를 참조 그리고 마지막으로, 거의 아무것도 당신이 방법은 많은 의미를 만드는 POST 없다 - 당신은 또한 는 RemoteAttribute 그래서 당신이 클라이언트 측 유효성 검사를받을 것을 UserID 속성에 적용 고려해야한다. 사용자가 이미 존재하는지 확인하기 위해 데이터베이스를 두 번 호출합니다. ModelState.IsValid 번을 여러 번 확인했습니다. user_imageimage_path 속성을 사용하면 이미지를 업로드해야하지만 어디에도 저장하지 않는 것이 좋습니다. ViewBag.AppDataDepartment을 할당 한 다음 즉시 Index() 방법으로 리디렉션합니다. 코드는 아카이브 된 기존의 사용자가 Create() 방법을 탐색해야 할 이유 같은 (파일 업로드 문제를 무시)는 불분명하지만

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(UserVM model) 
{ 
    // Return early 
    if (!ModelState.IsValid) 
    { 
     // You will enter this automatically of UserID is null 
     model.DepartmentList = ... // assign the SelectList 
     return View(model); 
    } 
    // One database call to check if the user exists 
    User user = database.Users.Where(p => p.UserID == model.UserID).FirstOrDefault(); 
    if (user != null && !user.active) 
    { 
     user.active = true; 
     // Save and redirect 
    } 
    else if (user != null) 
    { 
     ModelState.AddModelError(string.Empty, "USER already exists!"); 
     model.DepartmentList = ... // assign the SelectList 
     return View(model); 
    } 
    user = new User 
    { 
     UserID = model.UserID, 
     lastname = model.lastname, 
     .... // set other properties of User 
     Last_Modified = System.DateTime.Now 
    } 
    // Save and redirect 
} 

보일 것이다 (그리고 전체를 작성하는 양식을 제시 이전에 이미 입력 한 많은 세부 정보). 이전에 보관 된 사용자를 활성화하기위한 별도의 방법이 있어야합니다.

+0

사실 관리자 사용자 컨트롤입니다. 역할, 권한 및 사용자가있는 RBAC 모델을 구현했습니다. 그것들은 모두 Controller Admin에 함께 있습니다. 그래서 CreateRole과 CreatePermission을 가지고 있기 때문에 CreateUser와 같은 액션 이름을 가지고 있습니다. 게시물이있는 링크는 매우 유용합니다. – Azeristar

+0

그런 다음 [영역] (http://www.codeguru.com/csharp/net/net_asp/mvc/article.php/c20227/Using-Areas-in-ASPNET-MVC-Application.htm) –

+0

을 사용해야합니다. 고마워, 이것은 매우 논리적으로 들린다. 나는 오늘 그것을 구현하려고 노력할 것이다 :) 도움과 링크에 감사드립니다. – Azeristar

관련 문제