2012-09-18 29 views
6

này hoạt động:Làm thế nào để vượt qua một tham số tùy chọn vào ActionResult

public ActionResult Edit(int id, CompPhone cmpPhn) 
{ 
    var vM = new MyViewModel(); 
    if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; } 
    ... 
} 

Nếu tôi làm cmpPhn tùy chọn:

public ActionResult Edit(int id, CompPhone? cmpPhn) 

tôi nhận được "Lỗi 1 Kiểu 'MyProject.Models.CompPhone' phải một loại giá trị không thể sử dụng để sử dụng nó làm tham số 'T' theo kiểu hoặc phương thức chung 'System.Nullable'.

Làm cách nào để làm cho tham số đầu vào này thành phương pháp tùy chọn?

Dưới đây là mô hình điểm

public class MyViewModel : IValidatableObject 
{ 
... 
public CompPhone CmpPhnF { get; set; }  
... 
} 

gọi method

[HttpPost, ValidateAntiForgeryToken] 
public ActionResult PhoneTest(MyViewModel vM) 
{ 
    if (ModelState.IsValid) 
    { var cmpPhn = vM.CmpPhnF; 
    return RedirectToAction("Edit", new { id = vM.AcntId, cmpPhn }); 
    } 
    ... 
} 

Trả lời

12

Bạn chưa làm cho nó không bắt buộc, bạn đang làm cho nó nullable. Để làm cho nó tùy chọn, bạn cần phải xác định một giá trị mặc định cho tham số. (Nó chỉ có sẵn cho C# 4.0 trở lên):

public ActionResult Edit(int id, CompPhone cmpPhn = null) 

mã hiện tại của bạn được xác định là Nullable và có vẻ như rằng CompPhonelà một lớp không phải là một kiểu giá trị, và không thể Nullable.

CompPhone? cmpPhn tương đương với Nullable<CompPhone> nơi CompPhone phải là một struct

+0

Cảm ơn Habib cho thanh toán bù trừ mà tinh tế giữa lên nullable và không bắt buộc. Tôi thích câu trả lời của bạn hơn rablinz vì nó không yêu cầu sao chép phương thức. Và có CompPhone là một lớp học. – Joe

+0

@Joe, câu trả lời của rablinz cũng hợp lệ, nhưng nếu bạn đang sử dụng .Net framework 4.0 trở lên thì nó đi kèm với C# 4.0 có tùy chọn tham số mặc định cho một phương thức. Trước phiên bản đó, bạn phải thích ứng với câu trả lời của rablinz – Habib

+0

Tôi đã thêm phương thức gọi cho câu hỏi của mình. Bạn đã trả lời cách đưa lớp vào một phương thức. Tôi có một câu hỏi theo dõi làm thế nào để vượt qua một lớp học của một phương pháp. Khi tôi gỡ lỗi các phương pháp gọi id nhưng không phải là cmpPhn được thêm vào các giá trị tuyến đường. Cảm ơn – Joe

1

Tôi đồng ý với Habib, bạn đang làm cho các tham số nullable.

Để làm cho tham số tùy chọn xác định hai phương thức giống hệt nhau, một có tham số và một không có tham số. Người không có sẽ phải sử dụng một giá trị mặc định được xác định trước cho nó.

public ActionResult Edit(int id) 
{ 
    var vM = new MyViewModel(); 
    vM.CmpPhnF = defaultValue; 
    ... 
} 

public ActionResult Edit(int id, CompPhone cmpPhn) 
{ 
    var vM = new MyViewModel(); 
    if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; } 
    ... 
} 
Các vấn đề liên quan