2011-05-13 62 views
2

是否有一種簡單的方法將對象從我的視圖傳遞到控制器?查看數據從視圖到控制器

我試過ViewData [「newPerson」]但沒有奏效。

會議[「newPerson」]的作品,但有其他方式更推薦?

+1

從以conttoller?您需要重新考慮當前的應用程序體系結構。 – zerkms 2011-05-13 03:42:10

+0

傳入數據到您的控制器通常通過您的操作方法值,它來自路由值或發佈的數據。什麼阻止你使用它們? – anon 2011-05-13 03:43:40

回答

0

您正在實施表單嗎?你最好的選擇是在控制器上創建一個新的動作來接受你的對象。您的控制器將有一個這樣的方法:

public ActionResult MyAction(Person person) 
{ 
    // your code 
} 

或者,如果你希望它迴應的帖子:

[HttpPost] 
public ActionResult MyAction(Person person) 
{ 
    // your code 
} 

那麼你的觀點會打電話通過鏈接或表單提交您的控制器動作。一個鏈接一個例子:基於公認的答案

@Html.ActionLink("MyContoller", "MyAction", newPerson); 
3

通常你會收到一個模型作爲參數。您必須具有映射到模型屬性的表單字段。

public class PersonViewModel 
{ 
    [Required] 
    public string FirstName { get; set; } 

    [Required] 
    public string LastName { get; set; } 
    ... 
} 
在你看來

然後:

@model PersonViewModel 
@using (Html.BeginForm()) 
{ 
     <div class="editor-label">@Html.LabelFor(model => model.FirstName)</div> 
     <div class="editor-field">@Html.EditorFor(model => model.FirstName)</div> 

     <div class="editor-label">@Html.LabelFor(model => model.LastName)</div> 
     <div class="editor-field">@Html.EditorFor(model => model.LastName)</div> 
     ... 
} 

然後在對應的視圖發送動作和接收

[HttpGet] 
public ActionResult CreatePerson() 
{ 
    return View(new Person()); 
} 

[HttpPost] 
public ActionResult CreatePerson(PersonViewModel person) 
{ 
    var person = ...create and persist a Person entity based on the view model.... 
    return Redirect("details", new { id = person.id }); 
} 
1

你不應該想從傳遞一個對象模型的在調用控制器的操作之外查看您的控制器。如果您嘗試將參數傳遞給控制器​​操作,則可以添加路由值。

例如,這將通過作爲id參數值3到動作(使用路由邏輯)

@Html.ActionLink("Home", "Details", new { id = 3 }); 
0

我的印象是,你宣佈你的處理程序採取類型的FormCollection的參數。這可以通過變量的文本索引來檢索值。注意拼寫錯誤 - 嘗試檢索不存在的值只會返回空白。

0

,我的答案是不是你在找什麼,但基於Google(在寫作時),這就是回答最敏感實際將視圖中的數據傳遞給控制器​​。

如果您將值設置爲WebViewPage<T>.ViewContext.ViewData,則可以從控制器訪問該值。我們正在使用這種技術在視圖中設置一個電子郵件主題,我們將其呈現爲HTML電子郵件的主體。 (這種方法允許我們把主題定義連同電子郵件的正文以及訪問從控制器,我們實際發送電子郵件這個問題。)

/// <summary> 
/// Sends a system email containing a rendered view. 
/// </summary> 
public static void SendSystemEmailOfView(this Controller controller, string to, [AspMvcView] string viewName, object model, ViewDataDictionary viewData = null) 
{ 
    if (viewData == null) 
    { 
     viewData = new ViewDataDictionary(); 
    } 

    var body = controller.Render(viewName, model, viewData); 
    object subject; 
    if (viewData.TryGetValue(WebViewPageExtensions.ViewDataKey_EmailSubject, out subject)) 
    { 
     subject = subject as string; 
    } 
    if (subject == null) 
    { 
     subject = DefaultEmailSubject; 
    } 
    SendEmail(to, (string)subject, body, isHtml: true); 
} 

注:1)AspMvcViewAttribute是ReSharper的如果您不使用Resharper,則可以省略註釋。 2)controller.RenderSendEmail是外部方法(有很多關於如何發送電子郵件的答案以及如何從控制器內手動呈現視圖到字符串。)

我們的觀點是這樣的:

@model MyViewModel 
@{ 
    this.EmailSubject("Subject Here"); 
} 
<p> 
    Dear Web Forms, 
</p> 

<p> 
    I'm leaving you for MVC...it's just so much more...DRY. 
</p> 

.EmailSubject是這樣的:

public const string ViewDataKey_EmailSubject = "MyAppName_EmailSubject"; 

/// <summary> 
/// Sets an email subject in <paramref name="page"/>'s <see cref="WebViewPage{T}.ViewBag"/>. Useful for retrieving the subject from controller. 
/// </summary> 
public static void EmailSubject<T>(this WebViewPage<T> page, string subject) 
{ 
    // Must set value on ViewContext's ViewData if we want to access it after view renders; page.ViewData setter copies the ViewDataDictionary. 
    page.ViewContext.ViewData[ViewDataKey_EmailSubject] = subject; 
} 
相關問題