복붙노트

[SQL] ASP.NET MVC에서 컨트롤러 여러 매개 변수를 통과시키는 단계; 또한, LINQ - 투 - SQL에서 즉석 쿼리를 생성

SQL

ASP.NET MVC에서 컨트롤러 여러 매개 변수를 통과시키는 단계; 또한, LINQ - 투 - SQL에서 즉석 쿼리를 생성

나는 ASP.NET MVC를 배우기 위해 기본적인 문제 관리 시스템에서 일하고 있어요. 나는 그것을 입수하고 상당히 괜찮은 수준으로 실행하지만 난 문제로 실행했습니다했습니다.

나는 열기이라고 볼 수있는 문제라는 컨트롤러를 가지고있다. 열려있는 모든 문제 / 문제 / 열기 목록은 현재 시스템에 로그온. 그래서 같은 경로를 정의했습니다 :

    routes.MapRoute( 
        "OpenSort",                                                         // Route name
        "Issue/Open/{sort}",                                                // URL with parameters
        new { controller = "Issue", action = "Open", sort = "TimeLogged" }  // Parameter defaults
    );

이 IssueController.cs에 다음 코드를 사용하여, 지금까지 잘 작동 있습니다 :

public ActionResult Open(string sort)
{            
    var Issues = from i in db.Issues where i.Status == "Open" orderby i.TimeLogged ascending select i;

    switch (sort)
    {
        case "ID":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.ID ascending select i;
            break;

        case "TimeLogged":
            goto default;

        case "Technician":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Technician ascending select i;
            break;

        case "Customer":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Customer ascending select i;
            break;

        case "Category":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Category ascending select i;
            break;

        case "Priority":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Priority ascending select i;
            break;

        case "Status":
            Issues = from i in db.Issues where i.Status == "Open" orderby i.Status ascending select i;
            break;

        default:
            break;
    }            

    ViewData["Title"] = "Open Issues";
    ViewData["SortID"] = sort.ToString();

    return View(Issues.ToList());
}

나는 열기 문제보기에 두 가지 일을 할 수 있도록하려면 지금 만 (? 내가 스위치보다 쿼리의 나의 정의를 처리하기 위해 더 나은 방법이 있는지 궁금하지만)이 잘 작동한다 :

난 내 쿼리를 구성 할 수 있도록 컨트롤러에 두 개의 매개 변수를 전달하는 방법을 알아낼 수 없습니다. 나는 또한 깨달았으니 나는 내가 내 스위치를 필요로 (정렬 옵션의 수) * (필터 옵션의 수) 가고 비행에 내 쿼리를 생성하는 방법을 알아낼하지 않는 한.

아아, 올바른 방향으로 캔 누구 포인트 나? 건배!

해결법

  1. ==============================

    1.http://example.com/Issue/Open?sort=ID&filter=foo

    http://example.com/Issue/Open?sort=ID&filter=foo

    public ActionResult Open(string sort, string filter)
    

    MVC의 프레임 워크는 쿼리 문자열 매개 변수의 인수를 입력합니다. 확인하고 채워되지 않을 수 있습니다 이러한 쿼리 문자열 매개 변수 인수의 대한 (문자열 등) nullable 형식을 사용합니다.

    사실이 URL을 작성하는 "더 올바른"방법이라고 생각합니다. URL 자체는 자원을 (공개 문제) 식별; 쿼리 문자열 매개 변수는 자원을 표시하는 방법을 사용자 정의 할 수 있습니다.

    지금까지 쿼리 수는 가서, 한 번에 전체 쿼리를 작성하지 않아도 기억한다. 기존 된 IQueryable , 유사 어디에요로 다시 주문에 .OrderBy 확장 방법을 사용할 수 있습니다.

    var Issues = from i in db.Issues where i.Status == "Open" select i;
    
    switch (sort)
    {
        case "ID":
            Issues = Issues.OrderBy(i => i.ID);
            break;
    
        // [...]
    
        default:
            Issues = Issues.OrderBy(i => i.TimeLogged);
    }     
    
  2. ==============================

    2.당신이 매개 변수의 임의의 수를 기대한다면, 당신이 뭔가를 할 수 있습니다.

    당신이 매개 변수의 임의의 수를 기대한다면, 당신이 뭔가를 할 수 있습니다.

    
    public ActionResult Open(){            
       string[] keys = Request.QueryString.AllKeys;
       Dictionary queryParams = new Dictionary();
       foreach (string key in keys)
       {
         queryParams[key] = Request.QueryString[key];
       }
       string sort = queryParams["sort"];
       ...
    
    
    
  3. ==============================

    3.이 kimsks 대답에 코멘트 수 있지만 내가 잘못된 장소에 게시 할 수 있도록 의견을 어떤 이유로, 내가 심사 할 것을 요구한다.

    이 kimsks 대답에 코멘트 수 있지만 내가 잘못된 장소에 게시 할 수 있도록 의견을 어떤 이유로, 내가 심사 할 것을 요구한다.

    쿼리 문자열 매개 변수의 임의의 수를 처리하는 더 좋은 방법은 지금과 같은 ActionFilter를 사용하는 것입니다 :

    public class QueryStringFilterAttribute : ActionFilterAttribute
    {
        public string ParameterName { get; private set; }
    
        public QueryStringFilterAttribute(string parameterName)
        {
            if(string.IsNullOrEmpty(parameterName))
                throw new ArgumentException("ParameterName is required.");
            ParameterName = parameterName;
        }
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var qs = new FormCollection(filterContext.HttpContext.Request.QueryString);
    
            filterContext.ActionParameters[ParameterName] = qs;
    
            base.OnActionExecuting(filterContext);
        }
    }
    

    이제 당신은 [( "속성") QueryStringFilter이]과 같이 액션에 속성을 추가 할 수 있습니다 그리고 그것은 FormCollection로 쿼리 문자열 값을 전달합니다. 더 이상 요청 싱글에 따라 달라집니다로이 방법은 당신의 작업은 더 쉽게 테스트하지 않습니다.

  4. ==============================

    4.대신 스위치, 당신은 당신이 말할 수있는 동적 Linq에 사용할 수 :

    대신 스위치, 당신은 당신이 말할 수있는 동적 Linq에 사용할 수 :

    Issues = Issues.OrderBy("Status");
    

    http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

  5. ==============================

    5.모든 프로세스를 설명하는 아래의 게시물을 확인하시기 바랍니다 http://www.c-sharpcorner.com/UploadFile/4b0136/editing-multiple-records-using-model-binding-in-mvc/

    모든 프로세스를 설명하는 아래의 게시물을 확인하시기 바랍니다 http://www.c-sharpcorner.com/UploadFile/4b0136/editing-multiple-records-using-model-binding-in-mvc/

  6. from https://stackoverflow.com/questions/488061/passing-multiple-parameters-to-controller-in-asp-net-mvc-also-generating-on-th by cc-by-sa and MIT license