Envío de un valor de clave externa a una acción Crear

Estoy desarrollando un sitio web simple de seguimiento de proyectos. Un "Proyecto" tiene "Tareas" y una "Tarea" tiene "Subtareas". Con el andamiaje predeterminado, al crear una "Tarea", tengo que seleccionar manualmente el campo "ProjectId" de la "Tarea". Quiero tenerlo configurado, que solo podré crear una "Tarea" desde la vista "Detalle del proyecto". Me pregunto cómo puedo hacerlo para no tener que seleccionar manualmente el "ProjectId" al crear una nueva tarea. Aquí hay fragmentos:

Esto es parte de Create.cshtml para la tarea generada automáticamente por Visual Studio:

    <div class="editor-label">
        @Html.LabelFor(model => model.ProjectId, "Project Id")
    </div>
    <div class="editor-field">
        @Html.DropDownList("ProjectId", String.Empty)
        @Html.ValidationMessageFor(model => model.ProjectId)
    </div>

Esto da como resultado un cuadro desplegable donde tengo que seleccionar manualmente una identificación de proyecto.

Esta es la acción "Crear" predeterminada del controlador "Tarea":

    public ActionResult Create()
    {
        ViewBag.ProjectId = new SelectList(db.Projects, "Id", "Id");
        ViewBag.StatusId = new SelectList(db.Status, "Id", "Name");
        ViewBag.TaskTypeId = new SelectList(db.TaskTypes, "Id", "Name");
        return View();
    }

Lo que me gustaría es algo como esto:

    public ActionResult Create()
    {
        ViewBag.ProjectId = RouteData.Values["Id"];
        ViewBag.StatusId = new SelectList(db.Status, "Id", "Name");
        ViewBag.TaskTypeId = new SelectList(db.TaskTypes, "Id", "Name");
        return View();
    }

En algún lugar tendría que configurar myTask.ProjectId = ViewBag.ProjectId. Pero no se donde. ¿Es esta la forma correcta de hacerlo? ¿O hay un mejor camino?

Muchas Gracias

preguntado el 22 de mayo de 12 a las 20:05

¿Desea establecer realmente el valor seleccionado predeterminado de la ProjectId menú desplegable en la carga de la Create ¿página? ¿Es esto correcto? -

Por supuesto. a menos que haya una mejor manera de hacerlo. -

3 Respuestas

¿Estás seguro de que necesitas el DropDownList y no solo una entrada oculta con un valor fijo?

Parece que desea que se establezca el valor y ninguna representación visual del mismo debería ser visible. Si este es el caso, simplemente pase su ID en el modelo y luego vincúlelo a una entrada oculta.

contestado el 22 de mayo de 12 a las 20:05

si. eso es exactamente lo que estoy buscando. debe configurarse en el back-end, y el usuario no debe tener la opción de seleccionar la identificación del proyecto. - Gerson

Entonces tu enfoque al pasarlo RouteData Suena bien. Solo en lugar de DropDownList, use una entrada oculta en la vista. - Wiktor Zychla

esto es lo lejos que llegué con eso. En la vista Crear tarea: @Html.HiddenFor(model => model.ProjectId, "Project Id") - Gerson

Configuración del valor predeterminado de la ProjectId no es tan difícil como crees, hay una sobrecarga para SelectList eso toma un object selectedValue.

Reemplazar esto:

ViewBag.ProjectId = new SelectList(db.Projects, "Id", "Name");

Con esto (he usado 2 en este caso como el Id seleccionado):

ViewBag.ProjectId = new SelectList(db.Projects, "Id", "Name", 2);

contestado el 22 de mayo de 12 a las 20:05

Se me ocurren dos posibilidades.

Controlador:

public ActionResult Create()
{
    var task = new Task()  { ProjectId = your_predefined_value };
    ViewBag.Projects = new SelectList(db.Projects, "Id", "Id");
    ViewData.Model = task;
    return View();
}

Vista

@Html.DropDownListFor(x => x.ProjectId, (SelectList)ViewBag.Projects)

DropDownListFor preseleccionará el elemento de ViewBag.Projects cuyo Id coincida con x.ProjectId

Otra forma es configurar el Selected Propiedad de SelectListItem a verdadero en el artículo en particular.

Controlador:

public ActionResult Create()
{
    ViewBag.Projects = new List<SelectListItem>() { 
        new SelectListItem() 
        {
            Value = "1",
            Text = "Project 1",
            Selected = true
        }
    };
    //...
}

Vista

@Html.DropDownList("ProjectId", (IEnumerable<SelectListItem>)ViewBag.Projects)

contestado el 22 de mayo de 12 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.