2009-12-03 4 views
0

강력한 형식의 View는 Linq에서 SQL로 작성된 "Person"개체로부터 상속받습니다. 내 "편집"보기에, 나는 물론 이전 값으로 표시 할 수 있습니다모델 바인딩 및 트리밍 문자열 표시 속성

<%= Html.TextBox("FirstName") %> 

"FIRSTNAME는"NCHAR, 그래서 그것을 손질 할 필요가있다. 그래서 나는 다음과 같이 끝났다 :

<%= Html.TextBox("FirstName", Model.FirstName.Trim()) %> 

그리고 이것이 효과가있다. 양식이 제출 (POST 후) 일부 오류가 발생할 때, 나는 다시 표시해야합니다 :

[AcceptVerbsAttribute(HttpVerbs.Post), Authorize(Roles = "office"), HandleError] 
public ActionResult Edit(Models.Person person) 
{ 
    if (!(_personService.ValidatePerson(person))) // Persona non valida 
    { return View(person); } 
} 

만약 사용자가 텍스트 상자 "FIRSTNAME"를 떠나 어떤 이유로, 그 결과 부동산 Person.firstName에를 null이되고 Model.FirstName.Trim()은 Exception (개체 참조가 개체의 인스턴스로 설정되지 않음)을 throw합니다.

바인딩을 수정하고 모든 문자열이 기본적으로 트림되도록하는 방법은 무엇입니까? 또는이 아이디어를 수정하는 방법에 대한 아이디어가 있습니까??

업데이트 :은 MVC 2 동작으로 확인되었습니다. 여전히 이것을 처리하기위한 좋은 방법을 찾고 있습니다. 실제로 확장 방법을 사용하여 : Models.Person에서

public static string TrimOrDefault(this string value) 
{ 
    return value != null ? value.Trim() : string.Empty; 
} 
+0

이 부분 클래스 예를 들어 내 편집을 확인 @gremo. – griegs

답변

1

뭔가 이상합니다.

Model.FirstName은 null이 아니어야합니다. 모델 바인더는 빈 입력 필드 (텍스트 상자)를 ""로 설정할 정도로 똑똑합니다. 모델과 사용하는 텍스트 상자 사이의 속성 이름이 일치하는지 확인하십시오.

어떤 버전의 MVC를 사용하고 있습니까? 1 또는 2? VS 2008에서 MVC 1 버전을 실행 중이며 FirstName이 null이 될 수있는 유일한 방법은 양식에 전혀 포함하지 않는 것입니다.

초기 GET 편집보기에서이 오류가 발생하여 dbml 및 데이터베이스에서 FirstName을 nullable로 설정했는지 확인할 수 있습니다. 그러나 포스트이므로 나에게 지금 당장 이해가 가지 않습니다. ;)

업데이트 : 빈 양식

: :이 확인했습니다

2010 FIRSTNAME = ""

  • VS -

    • VS 2008 - MVC 1 - Mvc 2 - 이름 = null

    어 ... MVC 2

    public class HomeController : Controller 
    { 
        public ActionResult Index() 
        { 
         ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
    
         return View(); 
        } 
    
        public ActionResult About() 
        { 
         return View(); 
        } 
    
        public ActionResult AddPerson() 
        { 
         var person = new Person(); 
    
         return View(person); 
        } 
    
        [HttpPost] 
        public ActionResult AddPerson(Person person) 
        { 
         return View(person); 
        } 
    } 
    
    public class Person 
    { 
        public string FirstName { get; set; } 
        public string LastName { get; set; } 
    } 
    

    -

    <% using (Html.BeginForm()) {%> 
    
        <fieldset> 
         <legend>Fields</legend> 
         <p> 
          <label for="FirstName">FirstName:</label> 
          <%= Html.TextBox("FirstName", Model.FirstName) %> 
          <%= Html.ValidationMessage("FirstName", "*") %> 
         </p> 
         <p> 
          <label for="LastName">LastName:</label> 
          <%= Html.TextBox("LastName", Model.LastName) %> 
          <%= Html.ValidationMessage("LastName", "*") %> 
         </p> 
         <p> 
          <input type="submit" value="Save" /> 
         </p> 
        </fieldset> 
    
    <% } %> 
    

    VS 2010 :

    보기 (모두 동일) : 그게 전부는

    ... 코드를 많이 파괴하는 코드를 예정 VS 2008 - Mvc 1

    public class HomeController : Controller 
    { 
        public ActionResult Index() 
        { 
         ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
    
         return View(); 
        } 
    
        public ActionResult About() 
        { 
         return View(); 
        } 
    
    
        public ActionResult AddPerson() 
        { 
         var person = new Person(); 
    
         return View(person); 
        } 
    
        [AcceptVerbs(HttpVerbs.Post)] 
        public ActionResult AddPerson(Person person) 
        { 
    
         return View(person); 
        } 
    } 
    
    public class Person 
    { 
        public string FirstName { get; set; } 
        public string LastName { get; set; } 
    } 
    

    클린 수정 atm 없음. 모델 바인더는 실제로 이러한 속성을 null로 설정합니다. First와 Last를 생성자에서 ""로 설정하고 바인딩에서 해당 속성을 제외합니다. [Bind (Exclude = "FirstName, LastName")] 그들은 ""남습니다.

    여기에 문서가 있습니까?

  • +0

    나는이 아이디어를 생각하고있다. person 객체가 Edit 메소드에 전달 될 때 (즉, 검증 서비스를 받기 전에) 사용자 객체를 디버그하여이 시점에서 이름이 null이거나 비어 있는지 확인 했습니까? 유효성 검사 서비스에서 person 객체가 수정되고 거기에 null로 설정되어 있습니까? Model.ModelState.AddModelError를 사용하여 유효성 검사 오류를 모델 상태에 추가하고 있습니까? 그렇다면 Model.ModelState.SetModelValue도 사용합니다 (쌍으로 작동하고 SetModelValue를 무시하면 이상한 Null 오류가 발생 함). –

    +0

    Debuggin은 person 속성 (예 : "LastName"은 제출 후 null입니다 (해당 텍스트 상자에서 공백으로 설정 한 경우), 코드의 첫 번째 줄 바로 뒤에 있습니다. 이름이 일치합니다. 버전 2 vs 2010 베타 버전 1. 성이 아님 (30) null이 아님 ... 감사합니다. – gremo

    +0

    nullvs string.Empty 건에 대해 자세히 알아보십시오. http://stackoverflow.com/questions/1263563/modelbinding-for-empty -query-string-parameters-in-asp-net-mvc-2 –

    0

    기본값은 적어도 널 오류 elminate한다 String.Empty로 수있다.

    자동으로 사용하려면 dbml 파일에 추가하면됩니다. 첨부 된 designer.cs 파일이 있으며 각 필드에는 getter 및 setter가 있습니다. 원하는 경우 코드를 추가 할 수 있습니다.

    테이블을 기반으로 부분 클래스를 만들고 그 안에 트림을 처리 할 수도 있습니다. 즉, dbml 파일을 변경하면 변경 사항이 손실되지 않습니다.

    dbml 파일을 사용하고 있지 않다면 Google에 알려주십시오.

    편집

    그런 다음이 이미 부분적으로 선언됩니다 DBML 파일에 사람이라는 클래스가있는 경우.

    동일한 프로젝트에서 다른 클래스를 만들고 다음과 같이하십시오.

    public partial class Person 
    { 
        public string NewName 
        { 
         get { return this._name.Trim(); } 
        } 
    } 
    

    그래서 다음부터는 이름 대신 .NewName을 사용할 수 있으며 다시 트리밍됩니다. 거기에 코드를 추가하여 그것이 빨간색이 아닌 null이 아닌지 확인하고 무엇이든 적절한 값을 반환 할 수 있습니다.

    +0

    괜찮아 보이지만 부분 클래스를 만드는 방법을 알아야합니다. 난 정말 MVC와 asp.net에 일반적으로 새로운 ... 누군가가 dbml 파일을 편집하거나 부분 클래스를 만드는 방법에 대한 올바른 방향으로 날 가리킬 수 있습니까? – gremo

    +0

    designer.cs 파일이 생성됩니다. 수정 한 다음 dbml을 변경하면 모든 변경 사항이 사라졌습니다. – jfar

    +0

    그래, 내가 그랬다! 그래서 내가 부분 클래스에 대한 비트를 추가했습니다. – griegs

    -1

    누군가가 다른 사람에게 알려 주면이 작업을 수행하는 확장 방법을 알지 못합니다.

    null 일 수있는 필드에 대해 간단한 HTML 도우미를 만듭니다.

    public static string TrimOrDefault(string value) 
    { 
        return (value == null ? "" : value.Trim()); 
    } 
    

    그리고 코드에서 당신은

    <%= Html.TextBox("FirstName", Helpers.TrimOrDefault(Model.FirstName)) %> 
    

    그것은 쉽게 미래의 널 (NULL) 필드에 대한 재사용 및 읽고 있어요 사용할 수 있습니다.

    +1

    다운 유권자. 그래서 당신 downhote 솔루션을 가지고 믿는가? 이것은 실제로 수용 가능한 해결책입니다. – griegs

    +0

    "바인딩을 수정하고 기본적으로 모든 문자열을 다듬을 수있는 방법은 무엇입니까?" 답변은 모델 바인딩과 관련이 없으며 HTML 출력과 관련이 없습니다. 이번에는 Trim() 대신 extention 메서드를 사용하여 예제 코드를 작성했습니다. <% = Html.TextBox ("FirstName", Model.FirstName.Trim()) %> – jfar

    +0

    " 이것을 고쳐라?" 헬퍼는 nullable 필드를 처리하는 간단한 솔루션이었습니다. – Odd

    관련 문제