2010-11-16 657 views
6

Simple Q: ¿Cómo obtengo el cuadro de texto para mostrar el valor? Código de abajo fallan en item.LastNameMvc 3 texbox en webgrid (rasuradora)

@model List<Mvc2010_11_12.Models.Employee> 
@{ 
    var grid = new WebGrid(source: Model,defaultSort: "FirstName",rowsPerPage: 3); 
} 

<div id="grid1"> 
    @grid.GetHtml(columns: grid.Columns(
     grid.Column("LastName"), 
     grid.Column(format: (item) => Html.TextBox("LastName", item.LastName)) 
    )) 
</div> 

Respuesta

-1

nunca he utilizado el ayudante WebGrid embargo, does this link help? Discute el uso del ayudante webgrid en navaja de afeitar.

+0

No, eso es el código que estoy jugando con. Intento insertar un TextBox en la Grilla y llenar el valor del modelo. Obviamente me falta algo. – user408698

+0

ah bien, perdón por eso. – Chaddeus

3

bastante complicado, pero funciona:

@helper TextField(Employee employee, HtmlHelper<IEnumerable<Employee>> html) 
{ 
    @html.TextBoxFor(x => employee.LastName) 
} 

<div id="grid1"> 
    @grid.GetHtml(columns: grid.Columns(
     grid.Column("LastName"), 
     grid.Column(format: item => TextField(item.Value, Html)) 
    )) 
</div> 

Tal vez hay un método mejor, aunque. Todavía estoy aprendiendo la sintaxis de Razor y, francamente, estoy un poco decepcionado con el ayudante de WebGrid después de haber usado MVCContrib Grid.

+0

Hay una manera más fácil de hacerlo. – user408698

+0

@ user408698, espero que exista pero soy un poco escéptico. –

+0

Al usar este enfoque, cuando ese formulario con cuadros de texto se envía de regreso a una acción de HttpPost, ¿cómo sabe qué valor pertenece a cada registro? –

6

Los métodos de extensión (es decir, Html.TextBox) no funcionan bien con objetos dinámicos (es decir, elemento) ... es una limitación de C#.

Usted tiene algunas opciones:

formato: InputExtensions.TextBox(Html, "Last Name", item.LastName) // static call

formato: Html.TextBox("Last Name", (object)item.LastName) // cast as non-dynamic object

formato: &lt;input type="text" name="LastName" value="@item.LastName" /&gt; // avoid extensions

Además, creo que hay una lambda inherente con un "elemento" parámetro: no debería necesitar declararlo usted mismo.

+0

He llevado la pregunta al blog del presentador del código que estoy modificando (Shiju Varghese). Creo que necesitamos una guía sobre las mejores prácticas. – user408698

2

que se trabaje para mí

@model List<Mvc2010_11_12.Models.Employee> 
@{ 
    var grid = new WebGrid(source: Model,defaultSort: "FirstName",rowsPerPage: 3); 
} 

<div id="grid1"> 
    @grid.GetHtml(columns: grid.Columns(
     grid.Column("LastName"), 
     grid.Column(format: @<span>@Html.TextBox("LastName",@item.LastName as object)</span> ) 
    )) 
</div> 
1

Prueba esto:

grid.Column(format: (item) => Html.TextBox("LastName", (object) item.LastName)) 
0

que tenía que convertir objeto de cadena como sigue:

format: (item) => Html.ActionLink(
    (item.AppCode as object).ToString(), 
    "Index", 
    "ApplicationHealthCheck", 
    new { Code = item.AppCode }, 
    null), 
0

probar este

grid.Column("AmountValue", header: "Amount", format:@<text><input name="Amount" type="text" value="@item.AmountValue"</text>) 
0

Mostrando enlace o texto plano en base a una condición:

grid.Column(format: (dbItem) => dbItem.QtyCompleted == 0 ? 
       Html.ActionLink(
       "Start Setup", 
       "SaveData", 
       "Workorder", 
       new 
        { 
         msid = dbItem.MSID, 
         qtyCompleted = 0, 
         serialNum = "ABC" 
        }, 
       new 
        { 
         onclick = "return ConfirmAction('Start Setup');" 
        }) : 
       Html.Label(((DateTime)dbItem.StartTime).ToShortDateString()) 
      )